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

posted @   最萌小胡胡  阅读(1796)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示