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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值