2012-01-05 2 views
1

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

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'.

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

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

ответ

2

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 

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

+0

Это работало как шарм! Спасибо Эрик! – Anthony

+0

Требуется, чтобы 'id' был уникальным для работы, кстати. –

Смежные вопросы