我的数据库中有两个表,它们各自共享一个名为cID的字段。所以这是一个例子:
Parent Table
_______________
cID Name
-- ------
1 Record #1
2 Record #2
3 Record #3
Child Table
_______________
ID cID Name
-- --- -----
10 1 Record #1
11 1 Record #2
12 2 Record #3
13 1 Record #4
所以发生的事情是有人进入并从父表中删除了父表中的cID,子表仍然有那些cID,但他们现在什么都没引用。是否有一个SQL语句可以用来选择子表中不再有父表中的cID的所有记录?
答案 0 :(得分:1)
在您的文字中,您说父母遗失了,但您的示例显示父母没有孩子。
对于左边没有孩子的父母:
select
p.*
from
parent p
left join child c on p.cId = c.cId
where
c.cid is null
我创建了一个SQL Fiddle作为示例。
对于没有父母的孩子:
select
c.*
from
child c
left join parent p on p.cId = c.cId
where
p.cid is null
请注意,如果您将第一个查询更改为RIGHT
加入,那么您将获得与我更改表格顺序的第二个查询相同的答案。
答案 1 :(得分:0)
使用Subselect:
SELECT * FROM Child
WHERE cID NOT IN (SELECT cID FROM Parent)
加入:
SELECT Child.*
FROM Child
LEFT JOIN Parent ON Child.cID = Parent.cID
WHERE Parent.cID IS NULL
答案 2 :(得分:0)
这是另一种解决方案
Select Child.cId
From Child
Where Not Exists
(
Select 1
From Parent
Where Child.cID = Parent.cID)
)
您可以使用IN
执行相同的操作,但EXISTS
使用JOIN
是一种更有效的解决方案。
答案 3 :(得分:0)
除left join
找到空值外,您还可以使用where not exists
:
select *
from Child
where not exists (
select 1
from Parent
where cID = Child.cID
)
根据记录的数量和数据模型的其他标准,一个可能比另一个更高效。