使用多个连接进行过滤

时间:2014-11-12 23:53:42

标签: sql-server

我在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是一个中间表。

2 个答案:

答案 0 :(得分:1)

首先INNER JOIN Table BTable 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)