Подтвердить что ты не робот

Требуется 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, как найти родителя с подсчетом нулевых дочерних записей.

Спасибо.

4b9b3361

Ответ 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')