使用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中中不会有空值。尽管包含有其他值,任何这样的值都会让原始查询根本不会返回结果。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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上本地化部署