Вопрос:
Я вообще не знаком с SQL, поэтому надеялся, что кто-то может помочь мне с запросом, который найдет все записи в родительской таблице, для которых нет записей в дочерней таблице.
Ниже показано, как найти родительские записи для определенных значений дочернего поля…
`SELECT ParentTable.ParentID FROM ParentTable INNER JOIN ParentTable ON ParentTable.ParentID = ChildTable.ChildID WHERE (ChildTable.ChildField_ = ‘2131’) Group By ParentTable.ParentID Having count(distinct ChildTable.ChildField) > 0`
Могу ли я изменить предложение where, как найти родителя с подсчетом нулевых дочерних записей.
Спасибо.
Лучший ответ:
Вы можете использовать предложение NOT EXISTS для этого
SELECT ParentTable.ParentID FROM ParentTable WHERE NOT EXISTS ( SELECT 1 FROM ChildTable WHERE ChildTable.ParentID = ParentTable.ParentID )
Кроме того, старые левые соединения и проверка нулевого подхода
SELECT ParentTable.ParentID FROM ParentTable LEFT JOIN ChildTable ON ParentTable.ParentID = ChildTable.ParentID WHERE ChildTable.ChildID IS NULL
Попробуйте оба и посмотрите, какой из них лучше работает для вас.
Ответ №1
Внешнее соединение родительского с дочерним, а затем счетчик (*) = 0.
select p.parent_id, count(*) from parent p left outer join child c on p.parent_id = c.parent_id group by p.parent_id having count(*) = 0 Ответ №2
С другим примером, как
Содержание
- Перечислите таблицу
- Все родители, у которых есть дети (все ветки дерева, даже корни, но нет листьев!)
- Все дети, у которых нет детей (все листья дерева)
Перечислите таблицу
id: SERIAL name: TEXT enumerate_id: INT
Все родители, у которых есть дети (все ветки дерева, даже корни, но нет листьев!)
SELECT id, name, enumerate_id FROM enumerate p WHERE EXISTS ( SELECT 1 FROM enumerate c WHERE c.enumerate_id = p.id );
Все дети, у которых нет детей (все листья дерева)
SELECT id, name, enumerate_id FROM enumerate p WHERE NOT EXISTS ( SELECT 1 FROM enumerate c WHERE c.enumerate_id = p.id );
Обратите внимание, что единственный, кто меняет это NOT СУЩЕСТВУЕТ
Надеюсь, поможет
Ответ №3
Вы можете попробовать NOT IN
SELECT * FROM ParentTable WHERE ParentID NOT IN (SELECT DISTINCT ParentID FROM ChildTable) Ответ №4
Я просто не понимаю, Что having положение делает в запросе, как я вижу, уже вы говорите, where ChildTable.ChildField_ = ‘2131’, что уже означает, что вы имеете набор записей для childfield 2131 Попробуйте ниже запрос это будет означать, что если родитель оленьей кожи есть ребенок в Childtable с полем 2131 затем о/п то же самое.
SELECT ParentTable.ParentID FROM ParentTable Where ParentTable.ParentID NOT IN (Select ChildID From ChildTable where ChildTable.ChildField_ = ‘2131’)