Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.08;
Скачать: CL | DM;

Вниз

Импорт уникальных записей из двух связанных таблиц   Найти похожие ветки 

 
ruslan-id   (2008-06-27 12:25) [0]

Здравствуйте!
Возникла такая проблема:
База данных 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) один ко многим

не хотелось бы каждую запись оформлять в транзакцию. Записей может быть достаточно много и делается это достаточно часто.

Спасибо за ответы


 
ЮЮ ©   (2008-06-27 12:34) [1]

Написать и выпонить один запрос, а не "циклить" на клиентском НД.


 
ЮЮ ©   (2008-06-27 12:35) [2]

> как загрузить только уникальные записи из таблицы main.dbf
> и соответствующие им записи из таблицы info.dbf


Уникальность в чем состоит?


 
ЮЮ ©   (2008-06-27 12:41) [3]

Сорри, про .dbf не сразу уловил.
Правда гетерогенный запрос можно в BDE выполнить, если он "поддерживает" FB :)


 
Sergey13 ©   (2008-06-27 12:59) [4]

> [0] ruslan-id   (27.06.08 12:25)

Залей ВСЕ в промежуточные таблицы, а потом запросом из нее новые.


 
ruslan-id   (2008-06-27 13:00) [5]


> Сорри, про .dbf не сразу уловил.
> Правда гетерогенный запрос можно в BDE выполнить, если он
> "поддерживает" FB :)


У меня не используется BDE
База данных FireBird
а для выгрузки и загрузки используется TDBF
Уникальность состоит в наличии в таблице main уникального индекса включающего набор полей


 
ruslan-id   (2008-06-27 13:13) [6]


> Залей ВСЕ в промежуточные таблицы, а потом запросом из нее
> новые.

Хорошая идея. Поможешь составить запрос


 
Sergey13 ©   (2008-06-27 13:26) [7]

> [6] ruslan-id   (27.06.08 13:13)

Ключевое слово NOT EXISTS


 
Виталий Панасенко(дом)   (2008-06-27 13:40) [8]

select distinct from dbf.. раз уж мы отбрасываем дубли.. я так и не понял, где используется переменная povtor


 
ruslan-id   (2008-06-27 14:02) [9]

допустим есть базе таблицы с данными

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

Как это сделать?


 
Johnmen ©   (2008-06-27 14:11) [10]

Т.е. проблема сводится к откидыванию дубликатов по ключу?


 
Johnmen ©   (2008-06-27 14:15) [11]

Кстати, так [0] записи не добавляют. Ибо тормоза и расход памяти...


 
Johnmen ©   (2008-06-27 14:20) [12]

Пост [11] снимается по внимательном рассмотрении.


 
Виталий Панасенко(дом)   (2008-06-27 16:10) [13]


> В результате в базу должна добавится в main только запись
> 003 и соответств. записи из info_exp в info

Почему только они? а эти куда деть
0001  иванов иван иванович
0002  Петров петр петрович?


 
Johnmen ©   (2008-06-27 16:13) [14]


> Почему только они? а эти куда деть

А эти у него уже есть.


 
Виталий Панасенко(дом)   (2008-06-27 16:20) [15]

да, недосмотрел...тогда самое простое - try post except cancel end;


 
Anatoly Podgoretsky ©   (2008-06-27 16:20) [16]

not exists


 
Виталий Панасенко(дом)   (2008-06-27 16:21) [17]

опять недосмотрел...
try Table1.ExecSQL except end;


 
ruslan-id   (2008-06-27 18:16) [18]

Я нашел такие решения:
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



Страницы: 1 вся ветка

Текущий архив: 2009.02.08;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
3-1214294131
Oleg_teacher
2008-06-24 11:55
2009.02.08
Експорт из базы.


15-1229184736
Baks
2008-12-13 19:12
2009.02.08
Помогите выбрать "игровой" компьютер


2-1230394998
Te
2008-12-27 19:23
2009.02.08
!!!


2-1230060832
neveGreen
2008-12-23 22:33
2009.02.08
Не убивается форма


2-1230027493
Slav
2008-12-23 13:18
2009.02.08
Добавить текст на изображение JPEG