Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.02.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.007 c
2-1230027493
Slav
2008-12-23 13:18
2009.02.08
Добавить текст на изображение JPEG


3-1214818168
Новичек
2008-06-30 13:29
2009.02.08
Как сделать обратную сортировку в TClientDataSet?


1-1207734351
9899100
2008-04-09 13:45
2009.02.08
TTreeView


2-1230055107
kami
2008-12-23 20:58
2009.02.08
Доступ к открытому собой файлу


15-1229013971
Илья_
2008-12-11 19:46
2009.02.08
По теме начальных классов, "переход через десяток"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский