我目前有一个复杂的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 +
谢谢
答案 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
假设O1
是NOT 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