Текущий архив: 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