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行是否存在一无所知。