我并不熟悉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子句,了解如何查找具有零子记录数的父项。
感谢。
答案 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;