兼容MySQL与SQL Server的元组NOT IN查询语法报错问题
多数据库兼容查询改写方案
报错根因
「在预期使用条件的上下文中指定了非布尔类型的表达式,靠近','」报错是因为你使用了MySQL独有的多列行值表达式语法
(a.col2, b.col4) NOT IN (...),SQL Server 不支持这种非标准SQL写法,所以会触发语法错误。
兼容MySQL + SQL Server的改写方案
两种标准SQL实现均可达到和原语句完全一致的执行效果:
方案1:NOT EXISTS 写法(推荐)
注意子查询需要同时关联两个匹配列:
SELECT a.col1, b.col2 FROM tableA a JOIN tableB b ON b.col_x = a.col_x WHERE a.col5 IN ('VAL1', 'VAL2', 'VAL3') AND NOT EXISTS ( SELECT 1 FROM tableC c WHERE c.col2 = a.col2 AND c.col4 = b.col4 )
方案2:LEFT JOIN 空值判断写法
SELECT a.col1, b.col2 FROM tableA a JOIN tableB b ON b.col_x = a.col_x LEFT JOIN tableC c ON c.col2 = a.col2 AND c.col4 = b.col4 WHERE a.col5 IN ('VAL1', 'VAL2', 'VAL3') AND c.col2 IS NULL
说明
- 两种写法均为标准SQL语法,可同时在MySQL、SQL Server以及其他主流关系型数据库中正常运行
- 若你之前尝试NOT EXISTS未成功,是因为子查询未同时添加两个列的等值匹配条件,补充后即可正常执行
内容的提问来源于stack exchange,提问作者Eunito
相关产品推荐
相关产品推荐

