You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL查询迁移SQL Server时LEFT JOIN搭配IN操作符报错如何解决?

问题根因

你遇到的An expression of non-boolean type specified in a context where a condition is expected报错,核心是SQL Server 不支持多列组合匹配的IN语法:
你在HardDisk的左连接关联条件里写的(hd.Id, dol.EndTime) IN (子查询)是MySQL支持的行值表达式语法,但是SQL Server的语法规范不支持该写法,会把括号内的多列组合识别为非布尔表达式,不符合条件判断的语法要求,因此抛出对应错误。

修复方案

只需要修改HardDisk左连接的关联条件,将多列IN的写法替换为EXISTS条件即可,修改的代码片段如下:

-- 原错误写法
-- LEFT JOIN HardDisk hd ON hd.Id = dol.HardDiskId and (hd.Id, dol.EndTime) IN (select max(hd.Id) as Id, max(dol.EndTime) as EndTime from DiskOperationLog dol join HardDisk hd on hd.Id = dol.HardDiskId group by hd.Id)

-- 替换为以下兼容SQL Server的写法
LEFT JOIN HardDisk hd ON hd.Id = dol.HardDiskId 
AND EXISTS (
    SELECT 1
    FROM DiskOperationLog dol_inner
    JOIN HardDisk hd_inner ON hd_inner.Id = dol_inner.HardDiskId
    GROUP BY hd_inner.Id
    HAVING MAX(hd_inner.Id) = hd.Id AND MAX(dol_inner.EndTime) = dol.EndTime
)

其他注意事项

如果你使用的是SQL Server 2012以下的版本,还需要注意代码中的CONCAT函数需要替换为+拼接的写法,SQL Server 2012及更高版本原生支持CONCAT函数,不需要额外修改。

内容的提问来源于stack exchange,提问作者J86

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:15:05