![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Импорт уникальных записей из двух связанных таблиц [D7, FireBird 2]
ruslan-id © (2008-06-27 12:25:00)Здравствуйте!
Возникла такая проблема:
База данных Firebird 2
есть таблицы main и info связь один ко многим
есть аналогичные таблицы main.dbf и info.dbf с выгруженными данными
из другой копии программы
в базе данных в таблице main есть уникальный индекс не пропускающий
повторные записи
пытаюсь сделать загрузку данных след. образом
k:=0;
while not Timport.Eof do
begin
ok := true;
try
for i:=0 to Timport.FieldCount-1 do
Table1.Params[i].Value:=Timport.Fields[i].value;
if (Danie.pFIBTransactionWrite.Active = false) then
Danie.pFIBTransactionWrite.StartTransaction;
Table1.ExecQuery;
k:=k+1;
if (k mod 500)=0 then Danie.pFIBTransactionWrite.Commit;
except
ok := false;
povtor:=povtor+1;
end;
if ok then
begin
T_info.First;
while not T_info.Eof do
begin
for j:=1 to T_info.FieldCount-1 do
Table2.Params[j].Value:=T_info.Fields[j].value;
Table2.ExecQuery;
T_info.Next;
end;
end;
Timport.Next;
Gauge1.Progress:=Gauge1.Progress+1;
end;
т.е подтверждаю транзакцию через каждые 500 записей, получается что если
одна из 500 повторится то отменяться все 500,
если делать ролбэк.
как загрузить только уникальные записи из таблицы main.dbf и соответствующие им записи из таблицы info.dbf
связь
info.dbf (masterkey)-> main.dbf(key) один ко многим
и в базе тоже
info (masterkey)-> main(key) один ко многим
не хотелось бы каждую запись оформлять в транзакцию. Записей может быть достаточно много и делается это достаточно часто.
Спасибо за ответы
ruslan-id (2008-06-27 18:16:00) [1]Я нашел такие решения:
1. решение
1 загружаю все в промежуточную таблицу
2 загружаю из main_exp в main не повторяющиеся записи
3 удаляю из info все записи соответствующие main_exp
4 загружаю все записи из info_exp в info
2 решение
загружаю все уникальные записи из main_exp в main
создал уникальный индекс в таблице info (masterkey + data_p)
загружаю все уникальные записи из info_exp в info
Виталий Панасенко(дом) (2008-06-27 16:21:00) [2]опять недосмотрел...
try Table1.ExecSQL except end;
Anatoly Podgoretsky (2008-06-27 16:20:00) [3]not exists
Виталий Панасенко(дом) (2008-06-27 16:20:00) [4]да, недосмотрел...тогда самое простое - try post except cancel end;
Johnmen (2008-06-27 16:13:00) [5]
> Почему только они? а эти куда деть
А эти у него уже есть.
Виталий Панасенко(дом) (2008-06-27 16:10:00) [6]
> В результате в базу должна добавится в main только запись
> 003 и соответств. записи из info_exp в info
Почему только они? а эти куда деть
0001 иванов иван иванович
0002 Петров петр петрович?
Johnmen (2008-06-27 14:20:00) [7]Пост [11] снимается по внимательном рассмотрении.
Johnmen (2008-06-27 14:15:00) [8]Кстати, так [0] записи не добавляют. Ибо тормоза и расход памяти...
Johnmen (2008-06-27 14:11:00) [9]Т.е. проблема сводится к откидыванию дубликатов по ключу?
ruslan-id (2008-06-27 14:02:00) [10]допустим есть базе таблицы с данными
main (уникальный индекс F,I,O)
KEY F I O
0001 иванов иван иванович
0002 Петров петр петрович
info
MASTERKEY data_p result
001 01.01.2004 2
001 01.02.2004 1
002 01.03.2004 2
002 01.04.2004 3
002 01.06.2004 1
есть выгруженные данные (таблицы dbf или промежуточные таблицы в базе данных)
main_exp
KEY F I O
0001 иванов иван иванович
0002 Петров петр петрович
0003 Сергеев Сергей Сергеевич
info_exp
MASTERKEY data_p result
001 01.01.2004 2
001 01.02.2004 1
002 01.03.2004 2
002 01.04.2004 3
002 01.06.2004 1
003 01.04.2004 3
003 01.06.2004 1
В результате в базу должна добавится в main только запись 003 и соответств. записи из info_exp в info
Как это сделать?
Виталий Панасенко(дом) (2008-06-27 13:40:00) [11]select distinct from dbf.. раз уж мы отбрасываем дубли.. я так и не понял, где используется переменная povtor
Sergey13 (2008-06-27 13:26:00) [12]> [6] ruslan-id (27.06.08 13:13)
Ключевое слово NOT EXISTS
ruslan-id (2008-06-27 13:13:00) [13]
> Залей ВСЕ в промежуточные таблицы, а потом запросом из нее
> новые.
Хорошая идея. Поможешь составить запрос
ruslan-id (2008-06-27 13:00:00) [14]
> Сорри, про .dbf не сразу уловил.
> Правда гетерогенный запрос можно в BDE выполнить, если он
> "поддерживает" FB :)
У меня не используется BDE
База данных FireBird
а для выгрузки и загрузки используется TDBF
Уникальность состоит в наличии в таблице main уникального индекса включающего набор полей
Sergey13 (2008-06-27 12:59:00) [15]> [0] ruslan-id (27.06.08 12:25)
Залей ВСЕ в промежуточные таблицы, а потом запросом из нее новые.
ЮЮ (2008-06-27 12:41:00) [16]Сорри, про .dbf не сразу уловил.
Правда гетерогенный запрос можно в BDE выполнить, если он "поддерживает" FB :)
ЮЮ (2008-06-27 12:35:00) [17]> как загрузить только уникальные записи из таблицы main.dbf
> и соответствующие им записи из таблицы info.dbf
Уникальность в чем состоит?
ЮЮ (2008-06-27 12:34:00) [18]Написать и выпонить один запрос, а не "циклить" на клиентском НД.