Конференция "Базы" » Импорт уникальных записей из двух связанных таблиц [D7, FireBird 2]
 
  • ruslan-id (27.06.08 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) один ко многим

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

    Спасибо за ответы
  • ЮЮ © (27.06.08 12:34) [1]
    Написать и выпонить один запрос, а не "циклить" на клиентском НД.
  • ЮЮ © (27.06.08 12:35) [2]
    > как загрузить только уникальные записи из таблицы main.dbf
    > и соответствующие им записи из таблицы info.dbf


    Уникальность в чем состоит?
  • ЮЮ © (27.06.08 12:41) [3]
    Сорри, про .dbf не сразу уловил.
    Правда гетерогенный запрос можно в BDE выполнить, если он "поддерживает" FB :)
  • Sergey13 © (27.06.08 12:59) [4]
    > [0] ruslan-id   (27.06.08 12:25)

    Залей ВСЕ в промежуточные таблицы, а потом запросом из нее новые.
  • ruslan-id (27.06.08 13:00) [5]

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


    У меня не используется BDE
    База данных FireBird
    а для выгрузки и загрузки используется TDBF
    Уникальность состоит в наличии в таблице main уникального индекса включающего набор полей
  • ruslan-id (27.06.08 13:13) [6]

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

    Хорошая идея. Поможешь составить запрос
  • Sergey13 © (27.06.08 13:26) [7]
    > [6] ruslan-id   (27.06.08 13:13)

    Ключевое слово NOT EXISTS
  • Виталий Панасенко(дом) (27.06.08 13:40) [8]
    select distinct from dbf.. раз уж мы отбрасываем дубли.. я так и не понял, где используется переменная povtor
  • ruslan-id (27.06.08 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 © (27.06.08 14:11) [10]
    Т.е. проблема сводится к откидыванию дубликатов по ключу?
  • Johnmen © (27.06.08 14:15) [11]
    Кстати, так [0] записи не добавляют. Ибо тормоза и расход памяти...
  • Johnmen © (27.06.08 14:20) [12]
    Пост [11] снимается по внимательном рассмотрении.
  • Виталий Панасенко(дом) (27.06.08 16:10) [13]

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

    Почему только они? а эти куда деть
    0001  иванов иван иванович
    0002  Петров петр петрович?
  • Johnmen © (27.06.08 16:13) [14]

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

    А эти у него уже есть.
  • Виталий Панасенко(дом) (27.06.08 16:20) [15]
    да, недосмотрел...тогда самое простое - try post except cancel end;
  • Anatoly Podgoretsky © (27.06.08 16:20) [16]
    not exists
  • Виталий Панасенко(дом) (27.06.08 16:21) [17]
    опять недосмотрел...
    try Table1.ExecSQL except end;
  • ruslan-id (27.06.08 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
 
Конференция "Базы" » Импорт уникальных записей из двух связанных таблиц [D7, FireBird 2]
Есть новые Нет новых   [134434   +27][b:0][p:0.002]