行。因此,当我编写此查询时,我意识到它与我编写的任何其他因为表格结构不同。我试图汇总的三个表中的两个表示其他的,和其中一个引用可以为空。
Table A: aID (PK), etc
Table B: bID (PK), aID (FK), etc
Table C: cID, aID (FK), bID (nullable FK), etc
在我的查询中,我试图找到A
行中未引用的所有B
和C
行。
我尝试过各种各样的东西,其中最少的是正确的加入,我并不特别喜欢。我也考虑过某种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
答案 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
注意:编辑以回复评论。