在WHERE子句中过滤OUTER APPLY列

时间:2016-05-03 18:50:24

标签: sql sql-server database tsql sql-server-2012

我目前有一个复杂的SQL查询,它插入到临时表中。该查询包含OUTER APPLY,因为并非所有返回的记录都将应用于结果集。

我还需要使用OUTER APPLY子句中的WHERE列来过滤结果,但也要包含不适用于OUTER APPLY .e的结果。所有外部APPLY结果= 1且非外部应用结果。

这是查询布局的简单版本:

INSERT INTO #temp (X, Y, Z, O1, O2)
SELECT 
    X Y Z
FROM T1 
INNER JOIN T2, T etc.
OUTER APPLY (
    SELECT O1, O2 FROM XYZ…) OATable
WHERE
    OATable.O1 = 1 -- I tried just adding “IN (1, NULL)” but this 
still excludes the results. 

非常感谢任何帮助。

平台:SQL Server 2012 +

谢谢

3 个答案:

答案 0 :(得分:4)

您无法直接与NULL进行比较,因为没有任何内容等同于NULL(甚至不是NULL本身)。这就排除了在这里使用IN。相反,只需使用OR语句:

INSERT INTO #temp (X, Y, Z, O1, O2)
SELECT
    X, Y, Z,
FROM T1 
INNER JOIN T2 ON ...
OUTER APPLY (SELECT O1, O2 FROM XYZ…) OATable
WHERE
    OATable.O1 = 1 OR OATable.O1 IS NULL

假设O1NOT NULL中的XYZ列。

答案 1 :(得分:1)

我认为Tom H的回答是对所述问题的解答 但我认为这可能是你真正想要的东西

SELECT X Y Z, OATable.*
FROM T1 
INNER JOIN T2, T etc.
LEFT  JOIN XYZ as OATable 
        on OATable.O1 = 1 

在Tom的回答中你需要一个文字OATable.O1 IS NULL(来自我的发现)
如果列定义为非null,则不会发生这种情况 外部apply中的OATable.O1 IS NULL只会发现null的字面值,即使该列允许null

在这个答案中你得到的左侧与OATable O1 = 1

上没有匹配

答案 2 :(得分:1)

这是你想要实现的目标:

i / 7