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

Вниз

Помогите с запросом   Найти похожие ветки 

 
jack128 ©   (2006-10-30 17:56) [0]

День добрый.
Есть такая таблица

CREATE TABLE LICENCE_CARDS (
   ID                IDDOMAIN NOT NULL /* IDDOMAIN = BIGINT */,
   CHANGETIME        TIMESTAMP,
   DONGLEID          IDDOMAIN NOT NULL /* IDDOMAIN = BIGINT */,
   CARD_TYPE         INTEGER NOT NULL,
  -- и еще туча всего
);

треба построить уникальный индекс по полям (dongleid, card_type)
сооветственно нужно удалить ошибочные данные. Причем если есть несколько записей с одним и тем же dongleid, card_type, то оставить нужно только ту, у которой наибольший CHANGETIME.  И все это очень желательно одним запросом delete.
Есть вот такой монстр

delete from licence_cards
where id not in (
 select (select first 1 lc2.id from licence_cards lc2
         where lc2.dongleid = lc.dongleid and lc2.card_type = lc.card_type
         order by lc2.changetime desc)
 from licence_cards lc
 group by lc.dongleid, lc.card_type)

в правельности работы которого я даже не очень уверен

Можно ли как нить попроще это реализовать?


 
Desdechado ©   (2006-10-30 18:31) [1]

на ibase.ru есть статейка про поиск дубликатов
с красивыми примерами запросов


 
jack128 ©   (2006-10-30 18:53) [2]

Угу, есть, сенкс. http://ibase.ru/devinfo/deldupes.htm

Вот что на основании этой статьи надумал:

DELETE FROM LICENCE_CARDS T1 WHERE EXISTS
 (SELECT * FROM LICENCE_CARDS T2 WHERE
    (T2.DONGLEID = T1.DONGLEID) AND
    (T2.CARD_TYPE = T1.CARD_TYPE AND
    (T2.CHANGETIME >= T1.CHANGETIME) AND -- оставляем запись с наибольшим CHANGETIME
    (T2.ID <> T1.ID)
 )

Вроде работает. Спасибо.


 
Johnmen ©   (2006-10-31 11:58) [3]


> jack128 ©   (30.10.06 18:53) [2]


Замени * на 0 для ускорения процесса :)


 
jack128 ©   (2006-10-31 12:04) [4]

Johnmen ©   (31.10.06 11:58) [3]
Замени * на 0 для ускорения процесса :)

кста, а почему ускорение то должно возникнуть? Или сервер в расчет не берет, что явно прописан EXISTS?


 
jack128 ©   (2006-10-31 12:07) [5]

jack128 ©   (31.10.06 12:04) [4]
Или сервер
FB1.5


 
Johnmen ©   (2006-10-31 14:07) [6]


> jack128 ©   (31.10.06 12:04) [4]


Я не знаю, насколько интеллектуален анализатор выражений в FB, но стандартная схема предполагает (в данном случае) на каждую запись выполнить вложенный селект, а затем применить EXISTS. Даже если уже получив одну запись далее переход на EXISTS, то всё равно не надо тянуть все поля в буфер рабочей области, быстрее их вообще не тянуть, т.е. селект константы...



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

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

Наверх




Память: 0.45 MB
Время: 0.031 c
1-1164716831
DelphiLexx
2006-11-28 15:27
2007.01.21
DBGridEh и EndElipses


2-1167913967
Chaval
2007-01-04 15:32
2007.01.21
Проблема с использованием функции GetDriveType


2-1167362436
Adios
2006-12-29 06:20
2007.01.21
TRichEdit


2-1167202386
XTD
2006-12-27 09:53
2007.01.21
Код Asm.


2-1167944280
bolt
2007-01-04 23:58
2007.01.21
Программно выполнить DBCLICK?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский