你不能在IN中使用多个字段。如下查询:
SELECT *
FROM mytable
WHERE (col1, col2) IN
(
SELECT col1, col2
FROM othertable
)
这不会正常工作。
这一行为违反了标准并且是特定于SQL Server的。要解决这一问题,可以用EXISTS来代替IN如下:
SELECT *
FROM mytable m
WHERE EXISTS
(
SELECT NULL
FROM othertable o
WHERE o.col1 = m.col1
AND o.col2 = m.col2
)
值得注意的是,这仅适用于IN,而非NOT IN。
NOT IN与NOT EXISTS在处理空值的方式上略有不同。
要模仿这一包含NOT IN的查询如下:
SELECT *
FROM mytable m
WHERE (col1, col2) NOT IN
(
SELECT col1, col2
FROM othertable
)
我们必须使用以下查询:
SELECT *
FROM mytable m
WHERE NOT EXISTS
(
SELECT NULL
FROM othertable o
WHERE o.col1 = m.col1
AND o.col2 = m.col2
)
AND NOT EXISTS
(
SELECT NULL
FROM othertable o
WHERE o.col1 IS NULL
OR
o.col2 IS NULL
)
第二个谓词确保othertable 在col1和col2中中不会有空值。尽管包含有其他值,任何这样的值都会让原始查询根本不会返回结果。