Sql 通过相互引用连接表

Sql 通过相互引用连接表,sql,sql-server,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和B行中未引用的所有C行 我尝试过各种各样的东西,其中最少的是右连接,我并不特别喜欢。我还考虑过在x和y上进

嗯。因此,在编写这个查询时,我意识到它与我编写的任何其他查询都不同,因为它是表结构。我试图将三个表中的两个表都引用了其他两个表,其中一个表可以为空

Table A: aID (PK), etc  
Table B: bID (PK), aID (FK), etc  
Table C: cID, aID (FK), bID (nullable FK), etc 
在我的查询中,我试图找到
A
B
行中未引用的所有
C

我尝试过各种各样的东西,其中最少的是右连接,我并不特别喜欢。我还考虑过在x和y上进行某种形式的
连接
——但我不清楚这是做什么的,而且文档很少

例如

表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
我正在尝试查找C中未引用的所有A行和B行 划船

您可以使用
不存在

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 
)
不存在
是首选方法,因为它不会对联接列上的null值产生任何问题


如果不是每个a行都有一个b行,但您仍然希望看到a行(如对另一个答案的注释中所述),则必须使用
外部联接

SELECT A.aID, B.bID
FROM A LEFT OUTER JOIN B
  ON A.aID = B.aID 
WHERE NOT EXISTS ... (rest same)
我正在尝试查找C中未引用的所有A行和B行 划船

您可以使用
不存在

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 
)
不存在
是首选方法,因为它不会对联接列上的null值产生任何问题


如果不是每个a行都有一个b行,但您仍然希望看到a行(如对另一个答案的注释中所述),则必须使用
外部联接

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

你可以这样做:

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

注意:根据评论编辑。

您可以这样做:

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

注意:根据注释进行编辑。

任何时候看到右连接时,都可以将其重新编写为左连接-您只需在FROM子句中切换表的顺序。此外,如果能看到一些示例数据和所需结果来帮助澄清您的请求,那将非常棒!有几种方法可以做到这一点,具体取决于您需要什么。您可以添加一些示例数据和查询应该产生的预期结果吗?每当您看到右连接时,它可以被重新写为左连接-您只需要在FROM子句中切换表的顺序。此外,看到一些示例数据和期望的结果以帮助澄清您的请求也会很好!有几种方法可以做到这一点,具体取决于您需要什么。你能添加一些样本数据和查询应该产生的预期结果吗?问题是,我们不能保证每个a都有一个B,所以我对a行是否存在一无所知。问题是,我们不能保证每个a都有一个B,所以我对a行是否存在一无所知。