我在SQL Server 2008中工作。我知道,当加入2个表(称为A和B)时,如果我想返回A中但不在B中的所有记录,我使用:
SELECT
columns
FROM A
LEFT JOIN B
ON A.a_key = B.b_key
WHERE B.b_key IS NULL
在我的特殊情况下,我正在尝试加入3个表,其中一个是中间表。让我们称它们为A,B和C.(B是中间表。)以下是重要的列:
A:colA1,colA2
B:colB1,colB2
C:colC1,colC2
B.ColB2与A.ColA1匹配,C.colC1与B.colB1匹配。我的目标是返回A中不在C中的所有记录。所以,我现在最好的猜测是:
SELECT
columns
FROM A
LEFT JOIN B
ON A.colA1 = B.colB2
LEFT JOIN C
ON B.ColB1 = C.colC1
WHERE C.colC1 IS NULL
我知道A中有一些不在C中的记录。但是,我的查询并没有返回这些记录。我究竟做错了什么?我现在最好的猜测是我的连接错了,因为B是一个中间表。
答案 0 :(得分:1)
首先INNER JOIN
Table B
和Table C
。然后使用LEFT JOIN
Table A
结果,您将获得记录。试试这个。
SELECT *
FROM a
LEFT JOIN (SELECT *
FROM b
JOIN c
ON b.colb1 = c.colc1) Scd
ON a.cola1 = scd.colb2
WHERE scd.colb2 IS NULL
答案 1 :(得分:0)
实际上我从未见过这种语法,你比较键并添加强制你加入的键的条件为null。 此外 - 左连接不仅返回不在您正在加入的另一个表中的记录,它只是不删除那些没有匹配的记录,而是用空值填充其余列。但它也保留了两个表中匹配的记录。您可以转到here获取明确的示例。
这听起来不像左连接是要走的路。为什么不定期加入并使用not it
,如下所示:
select columns
from A, B
where A.colA1 = B.colB2
and B.colB1 not in (select C.colC1 from C)