sql条件子查询 - 如果返回null则忽略子查询?

时间:2013-09-19 15:57:40

标签: sql sql-server

我有一个带有连接子查询的查询。如果子查询返回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或其他方式执行某些操作吗?请提供代码示例。

4 个答案:

答案 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自己验证..但是,你明白了,对吗?