我想要创建的视图有问题。我在左外连接中加入了两个表,例如tableA
和tableB
,其中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。
答案 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
);