将表连接到彼此的引用

时间:2014-09-04 14:54:32

标签: sql sql-server

行。因此,当我编写此查询时,我意识到它与我编写的任何其他因为表格结构不同。我试图汇总的三个表中的两个表示其他其中一个引用可以为空。

Table A: aID (PK), etc  
Table B: bID (PK), aID (FK), etc  
Table C: cID, aID (FK), bID (nullable FK), etc 

在我的查询中,我试图找到A行中未引用的所有BC行。

我尝试过各种各样的东西,其中最少的是正确的加入,我并不特别喜欢。我也考虑过某种JOIN ON x AND y - 但我不清楚这是什么,而且文档很少。

E.G。

表A

aID
1
2
3

表B

bID     aID
1       1
2       1
3       2

表C

cID aID bID
1   1   NULL
2   1   1
3   2   NULL

查询应返回

aID bID
1   2
2   3
3   NULL

2 个答案:

答案 0 :(得分:3)

  

我正在尝试找到C中未引用的所有A和B行   行。

您可以使用NOT EXISTS

SELECT A.aID, B.bID
FROM A INNER JOIN B
  ON A.aID = B.aID 
WHERE NOT EXISTS
(
   SELECT 1 FROM C
   WHERE A.aID = C.aID OR B.bID = C.bID 
)

Not Exists是首选方法,因为它在join-column上没有null值问题。 Read


如果不是每个a-row都有一个b-row但是你想要看到a-row(如对另一个答案的评论所述),你必须使用Outer Join

SELECT A.aID, B.bID
FROM A LEFT OUTER JOIN B
  ON A.aID = B.aID 
WHERE NOT EXISTS ... (rest same)

答案 1 :(得分:1)

你这样做是这样的:

SELECT A.aID, B.bID
FROM A
LEFT OUTER JOIN B ON A.aID=B.aID -- We are not guaranteed to have B for each A
LEFT OUTER JOIN C ON C.aID=A.aID AND (C.bID IS NULL OR C.bID=B.bID)
WHERE C.cID IS NULL

注意:编辑以回复评论。