左外连接的SQL where子句

时间:2011-08-24 07:27:19

标签: sql sql-server-2008

我想要创建的视图有问题。我在左外连接中加入了两个表,例如tableAtableB,其中tableB在外部连接处。

我想只选择表B中状态等于4的那些行,所以我将WHERE state = 4添加到我的查询中。现在结果集被修剪了很多,因为tableB中没有匹配行的所有行都从结果中删除(因为这些行的状态不是4)。我也尝试了WHERE state = 4 OR state IS NULL,也没有用(因为state技术上没有NULL没有状态时)。

所以我需要的是一个WHERE语句,它仅在实际存在行时进行评估,是否存在这样的事情?

如果没有,我会看到两个选项:join (SELECT * FROM tableB WHERE state = 4)而不是表B,或者使用相同的WHERE语句创建一个视图并将其加入。明智的选择是什么?

顺便说一下,这是SQL Server 2008 R2。

4 个答案:

答案 0 :(得分:6)

您将条件放在on子句中。例如:

select a.this, b.that
from TableA a
left join TableB b on b.id = a.id and b.State = 4

答案 1 :(得分:4)

您可以将state = 4添加到加入条件。

select * 
from T1
  left outer join T2
    on T1.T1ID = T2.T1ID and
       T2.state = 4

答案 2 :(得分:1)

比子查询更容易扩展on子句,比如;

select  *
from    TableA a
left    join
        TableB b
on      a.b_id = b.id
        and b.state = 4

将显示TableA中的所有行,并且只显示TableB中状态为4的行。

SQL Server可能会以完全相同的方式执行视图,展开on和子查询。所以表现明智,应该没什么区别。

答案 3 :(得分:0)

替代方法:(1)内联接到表B,其中状态等于4,(2)反连接到表B以查找不存在的行,(3)联合结果:

SELECT A1.ID, A1.colA, B1.ColB
  FROM tableA AS A1
       INNER JOIN tableB AS B1
          ON A1.ID = B1.ID
             AND B1.state = 4
UNION
SELECT A1.ID, A1.colA, '{{MISSING}}' AS ColB
  FROM tableA AS A1
 WHERE NOT EXISTS (
                   SELECT * 
                     FROM tableB AS B1
                     WHERE A1.ID = B1.ID
                  );

可替换地:

SELECT A1.ID, A1.colA, B1.ColB
  FROM tableA AS A1
       JOIN tableB AS B1
          ON A1.ID = B1.ID
             AND B1.state = 4
UNION
SELECT ID, colA, '{{NA}}' AS ColB
  FROM tableA 
 WHERE ID IN (
              SELECT ID
                FROM tableA
              EXCEPT 
              SELECT ID
                FROM tableB
             );