-
Туплю, бывает. Есть иерархическая таблица "Мастер"(id, parentid). В ней какое-то дерево. Есть подчинённая таблица "Деталь", со вторичным ключом на мастер.id. Условие такое, что каждая запись из "Детали" должна ссылаться строго на "лист" дерева в мастере.
Так вот, похоже, что в "Деталь" проникло несколько записей, которые ссылаются не на лист в мастере, а на узел.
Вот как бы мне одним запросом вытащить список Деталь.id, которые на узел ссылаются? Или список Master.id, которые узлы и на которые кто-то из детали ссылается?
Варианты: "А нафига тебе одним запросом, сделай поэтапно" не предлагать, я это и так уже сделал. Тут просто спортивный интерес. БД спецом не указываю, ибо опой чую, что обычным ANSI можно всё сделать.
-
все id на которые есть ссылка "справа" от "листвы" т.е. parentid являются либо корнем, либо узлом... т.е. простое select id from Мастер where id not in (select distinct parentid from Мастер) даст список id "листьев". а выборка из Деталь на id которые отсутствуют в предварительной выборке даст все "неправильные", т.е. либо к узлу, либо вообще в "молоко" соединенные. select id from Деталь id not in (select id from Мастер where id not in (select distinct parentid from Мастер))
ну, типа. вроде правильно, по логике.
-
select id from Мастер where id not in (select distinct parentid from Мастер)
твою дивизию!
Ну ведь точно, select distinct parentid
Блин, и как я проглядел???
Спасибо!
|