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
相关产品推荐
相关产品推荐

