Требуется SQL-запрос для поиска родительских записей без дочерних записей

Вопрос:Я вообще не знаком с SQL, поэтому надеялся, что кто-то может помочь мне с запросом, который найдет все записи в родительской таблице, для которых нет записей в дочерней таблице. Ниже показано, как найти родительские записи для определенных значений дочернего поля... `SELECT ParentTable.ParentID FROM ParentTable INNER JOIN ParentTable ON ParentTable.ParentID = ChildTable.ChildID WHERE (ChildTable.ChildField_ = '2131')

Вопрос:

Я вообще не знаком с 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

С другим примером, как

Содержание

  1. Перечислите таблицу
  2. Все родители, у которых есть дети (все ветки дерева, даже корни, но нет листьев!)
  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 СУЩЕСТВУЕТ

Надеюсь, поможет

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

Оцените статью
Добавить комментарий