查询缺少链接的数据库表

时间:2014-04-17 17:46:12

标签: sql sql-server sql-server-2008

我的数据库中有两个表,它们各自共享一个名为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的所有记录?

4 个答案:

答案 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

Fiddle

请注意,如果您将第一个查询更改为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
)

根据记录的数量和数据模型的其他标准,一个可能比另一个更高效。