Название: Удалить дубликаты по условию из другой таблицы Отправлено: SibBear от Августа 20, 2012, 23:09 Добрый день. Возникла неожиданно сложная задача. Имеется таблица party:
Код и дочерняя таблица times: Код В первой таблице необходимо удалить дубликаты, причем сравнивать нужно несколько колонок (ic, party_number, ml). Кроме того, нужно удалить дубликаты так, чтобы остались записи, для которых во второй таблице последнее значение o_time - наибольшее. Например, в данном случае: Код в базе должна остаться запись с id=234, т.к. в таблице times ей соответствует бОльшая величина (40000). Как этого добиться в БД SQLite? Название: Re: Удалить дубликаты по условию из другой таблицы Отправлено: trot от Августа 21, 2012, 08:24 Для postgresql это решается так:
delete from party where ic=ic and party_number=party_number and ml=ml and id in (select party_id from (select distinct on (party_id) party_id, id, o_time from times order by party_id, o_time desc) as t order by o_time limit 1) Название: Re: Удалить дубликаты по условию из другой таблицы Отправлено: LisandreL от Августа 21, 2012, 13:43 Пример базы приложите - так проще будет.
Название: Re: Удалить дубликаты по условию из другой таблицы Отправлено: SibBear от Августа 21, 2012, 14:23 Пример базы приложите - так проще будет. Код
Название: Re: Удалить дубликаты по условию из другой таблицы Отправлено: MoPDoBoPoT от Августа 21, 2012, 22:51 Вариант для Oracle
Код Случай, когда максимальные o_time для дубликатов равны, не рассматривается (для приведенного кода оба не удаляться). Название: Re: Удалить дубликаты по условию из другой таблицы Отправлено: SibBear от Августа 21, 2012, 23:57 Вариант для Oracle Код Случай, когда максимальные o_time для дубликатов равны, не рассматривается (для приведенного кода оба не удаляться). Спасибо, конечно, но можно ли обойтись без WITH, его нет в SQLite? Название: Re: Удалить дубликаты по условию из другой таблицы Отправлено: LisandreL от Августа 22, 2012, 10:20 Ну очевидный вариант:
Код
Но на большой базе, тем более без индексов будет работать не быстро. Название: Re: Удалить дубликаты по условию из другой таблицы Отправлено: SibBear от Августа 22, 2012, 13:45 Большое спасибо!
Название: Re: Удалить дубликаты по условию из другой таблицы Отправлено: MoPDoBoPoT от Августа 22, 2012, 21:38 Код
Собственно, этот подзапрос неправильно работает, он всё время мне выдаёт party_id=234 (даже если для party_id=123 установить самый большой o_time). Спасибо, конечно, но можно ли обойтись без WITH, его нет в SQLite? WITH ... AS указал для оптимизации, намекая на то, что лучше эти данные расчитать заранее (например, занеся их во временную таблицу). А так, в запросе вместо view_times можно подставить подзапрос:Код
Название: Re: Удалить дубликаты по условию из другой таблицы Отправлено: SibBear от Августа 23, 2012, 14:18 Спасибо. Довольно медленно, но работает.
|