我有一个带有连接子查询的查询。如果子查询返回null,我希望它被忽略,我希望查询的其余部分正常工作。
目前我有类似的东西:
SELECT a, b, c, d
FROM tblOne
JOIN tblTwo ON tblOne.a = tblTwo.a --this works fine
JOIN
(SELECT a
FROM tblThree) ON tblThree.a = tblOne.a
问题是如果tblThree.a为null,则整个查询返回null。所以,如果tblThree.a不为null,我只想使用子查询。
我可以使用CASE或COALESCE或其他方式执行某些操作吗?请提供代码示例。
答案 0 :(得分:5)
使用LEFT OUTER JOIN
代替INNER JOIN
。即使tblThree
没有返回匹配的行,这也将返回查询其余部分的所有行。在这种情况下,tblThree
的列都将为NULL
。
使用您的查询(虽然我已为派生表添加了所需的别名):
SELECT a, b, c, d
FROM tblOne
INNER JOIN tblTwo ON tblOne.a = tblTwo.a
LEFT OUTER JOIN
(
SELECT a, e, f
FROM tblThree
) tblThree ON tblThree.a = tblOne.a
注意,正如@ 491243所指出的,派生表子查询在这里并没有多大意义。您也很可能在SELECT子句中有一个不明确的列a
。我猜这只是你真实查询的推断。
答案 1 :(得分:1)
尝试将第三个连接更改为LEFT JOIN。
LEFT JOIN
(SELECT a, e, f
FROM tblThree) ON tblThree.a = tblOne.a
然后,如果a为null,您仍将在尝试加入之前获取原始行。另一种选择是添加
WHERE a IS NOT NULL
到子查询中,只返回a有值的行。
答案 2 :(得分:0)
我不确定你的意思是“如果tblThree.a为null,则整个查询返回null”。 NULL
的{{1}}值会影响一行,而不是所有结果。否则匹配的行仍然匹配。
以下可能会做你想要的,但是:
a
此查询计算select a, b, c, d
from (SELECT a, b, c, d, count(tblThree.a) over () as nummatches, tblthree.a as t3a
FROM tblOne JOIN
tblTwo
ON tblOne.a = tblTwo.a LEFT OUTER JOIN
(SELECT a, e, f
FROM tblThree
) tblThree
ON tblThree.a = tblOne.a
) t
where nummatches = 0 or nummatches > 0 and t3a is not null;
中有效a
值的数量。如果没有,则返回全部,否则只返回匹配的。顺便说一下,如果使用带有列名的表别名,则不需要表的子查询。
答案 3 :(得分:0)
尝试使用EXISTS ..
SELECT a, b, c, d
FROM tblOne, tblTwo
WHERE EXISTS(
SELECT a from tblThree
WHERE tblThree.a=tblOne.a) AND tblOne.a = tblTwo.a;
Dint自己验证..但是,你明白了,对吗?