Главная страница
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.48 MB
Время: 0.029 c
15-1167581198
Pazitron_Brain
2006-12-31 19:06
2007.01.21
Не удаляйте мои темы


2-1166787295
Sp1r1t
2006-12-22 14:34
2007.01.21
как в TreeView добавить картинку ?


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


2-1167456399
Adios
2006-12-30 08:26
2007.01.21
copyfile


15-1167147562
Ученик чародея
2006-12-26 18:39
2007.01.21
За поиск НЛО в сетях пентагона хакеру грозит 70 лет тюрьмы.