Удаление строк с повторяющимися вторичными значениями - PullRequest
1 голос
/ 05 января 2012

Этот вопрос, вероятно, является вопросом софтбола для любого администратора баз данных, но вот мой вызов. У меня есть таблица, которая выглядит так:

id     parent_id    active
---    ---------    -------
1      5            y
2      6            y
3      6            y
4      6            y
5      7            y
6      8            y

То, как работает система, над которой я работаю, должно иметь только одну активную строку на каждого родителя. Таким образом, было бы хорошо, если бы ID # 2 и # 3 были активны = 'n'.

Мне нужно выполнить запрос, который находит все строки с дубликатами parent_ids, которые активны, и переворачивает все, кроме самого высокого идентификатора, в active = 'y'.

Можно ли это сделать одним запросом или мне нужно написать скрипт для этого? (Используя Postgresql, кстати)

1 Ответ

2 голосов
/ 05 января 2012

Стиль ANSI:

update table set
    active = 'n'
where
    id <> (select max(id) from table t1 where t1.parent_id = table.parent_id)

Postgres специфично:

update t1 set
    active = 'n'
from
    table t1
    inner join (select max(id) as topId, parent_id from table group by parent_id) t2 on
        t1.id < t2.topId
        and t1.parent_id = t2.parent_id

Второй, вероятно, немного быстрее, так как он не выполняет коррелированный подзапрос для каждой строки. Наслаждайтесь!

...