是否可以设置一个也匹配空子集的IN
语句?
这是我的疑问:
.. WHERE id IN (SELECT * FROM #subset)
如果#subset
为空,我也想要该记录。
解决方法是:
.. WHERE NOT EXISTS(SELECT * FROM #subset) OR id IN (SELECT * FROM #subset)
然而(SELECT * FROM #subset
)并不是一个简单的查询,我想知道有一种聪明的方法可以使用“IN”和空子集。
答案 0 :(得分:3)
使用双阴性表达。
而不是
存在匹配
的行
..这是
其中不存在与
不匹配的行
DECLARE @m TABLE (KeyCol int, Payload varchar(2));
DECLARE @s TABLE (KeyCol int);
INSERT @m VALUES (1, 'aa'), (2, 'bb'), (3, 'cc');
-- No values in #subset
SELECT
*
FROM
@m M
WHERE
NOT EXISTS (SELECT * FROM @s S WHERE M.KeyCol <> S.KeyCol);
INSERT @s VALUES (2);
-- A matching value in #subset
SELECT
*
FROM
@m M
WHERE
NOT EXISTS (SELECT * FROM @s S WHERE M.KeyCol <> S.KeyCol);
当然,相关的EXISTS WHERE子句可以扩展到多个列(与只需要一列的IN子句不同)