使用SQL Server时必须注意的10个特性:IN中的多重字段

你不能在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中中不会有空值。尽管包含有其他值,任何这样的值都会让原始查询根本不会返回结果。

原文地址:https://www.cnblogs.com/xiaohuhu/p/14485787.html