Требуется SQL-запрос для поиска родительских записей без дочерних записей
Я вообще не знаком с 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, как найти родителя с подсчетом нулевых дочерних записей.
Спасибо.
Ответы
Ответ 1
Вы можете использовать предложение 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
Попробуйте оба и посмотрите, какой из них лучше работает для вас.
Ответ 2
Внешнее соединение родительского с дочерним, а затем счетчик (*) = 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
Ответ 3
С другим примером, как
Перечислите таблицу
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
СУЩЕСТВУЕТ
Надеюсь, поможет
Ответ 4
Вы можете попробовать NOT IN
SELECT * FROM ParentTable WHERE ParentID NOT IN (SELECT DISTINCT ParentID FROM ChildTable)
Ответ 5
Я просто не понимаю, Что 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')