0

我有一个带有连接子查询的查询。如果子查询返回 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 不为空,我只想使用子查询。

我可以用CASE或 COALESCE 或其他方式做些什么吗?请给出代码示例。

4

4 回答 4

5

使用 aLEFT 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 所指出的,这里的派生表子查询实际上没有意义。a您也很可能在 SELECT 子句中有一个不明确的列。我猜这只是您真实查询的推断。

于 2013-09-19T15:59:34.583 回答
1

尝试将您的第三个联接更改为 LEFT JOIN。

LEFT JOIN
    (SELECT a, e, f
    FROM tblThree) ON tblThree.a = tblOne.a

然后,如果 a 为空,您仍然会在尝试加入之前获得原始行。另一种选择是添加

WHERE a IS NOT NULL 

到您的子查询以仅返回 a 具有值的行。

于 2013-09-19T16:01:16.923 回答
0

我不确定“如果 tblThree.a 为空,则整个查询返回空”是什么意思。的NULLa会影响一行,而不是所有结果。否则匹配的行仍然会匹配。

但是,以下内容可能会满足您的要求:

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数量tblThree。如果没有,则返回所有,否则只有匹配的。顺便说一句,如果您将表别名与列名一起使用,则不需要该表的子查询。

于 2013-09-19T16:03:42.760 回答
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;

自己验证这一点.. 但是,你明白了,对吧?

于 2013-09-19T17:42:20.830 回答