需要SQL Query来查找没有子记录的父记录

时间:2011-07-27 04:41:01

标签: 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子句,了解如何查找具有零子记录数的父项。

感谢。

6 个答案:

答案 0 :(得分:69)

您可以为此

使用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 :(得分:4)

外部加入父级到子级,然后使用count(*)= 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)

再举一个例子

枚举表

    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 :(得分:0)

您可以尝试NOT IN

SELECT * FROM ParentTable WHERE ParentID NOT IN (SELECT DISTRINCT ParentID FROM ChildTable)

答案 4 :(得分:0)

我只是不理解having子句在查询中的作用,因为我已经看到您在说where ChildTable.ChildField_ = '2131',这意味着您已经为子字段2131设置了记录 尝试下面的查询,这意味着如果父级在Childtable中没有孩子,且字段2131则o / p相同。

     SELECT    ParentTable.ParentID
         FROM      ParentTable 
         Where ParentTable.ParentID NOT IN (Select ChildID 
        From ChildTable where
         ChildTable.ChildField_ = '2131')

答案 5 :(得分:0)

如果在子表上进行左联接,只需说出子parentID为null的位置即可。

SELECT ParentTable.ParentID FROM ParentTable P
    Left Join ChildTable C on C.ParentID = P.ParentID
    WHERE C.Id IS NULL;