为何PostgreSQL可用的多列IN子查询在SQL Server中报错?
多列IN查询在SQL Server报错的原因
你遇到的问题核心是SQL Server对ANSI SQL多列元组IN语法的支持滞后于PostgreSQL:
- PostgreSQL、MySQL、Oracle等数据库很早就实现了ANSI SQL标准中的多列元组匹配语法,允许
(列1, 列2) IN (子查询)这种写法——它会把多个列组合成一个逻辑元组,和子查询返回的元组集合做逐一匹配。 - 但SQL Server在2017及更早的版本中,完全不支持这种多列元组的IN语法。它会将
(DEPT_NAME,SALARY)解析成一个非布尔类型的表达式,无法识别这是一个多列匹配条件,因此抛出错误:
An expression of non-boolean type specified in a context where a condition is expected, near ','.
SQL Server 2019及之后的版本已经支持了这种多列IN语法,如果你使用的是旧版本,就只能用替代方案,比如你已经用到的JOIN,或者用EXISTS子查询来实现相同逻辑:
用EXISTS替代的写法
SELECT DEPT_NAME, SALARY FROM EMPLOYEE e WHERE EXISTS ( SELECT 1 FROM EMPLOYEE e2 WHERE e2.DEPT_NAME = e.DEPT_NAME GROUP BY e2.DEPT_NAME HAVING e.SALARY = MAX(e2.SALARY) )
用JOIN的写法(你已经采用的方案)
SELECT e.DEPT_NAME, e.SALARY FROM EMPLOYEE e JOIN ( SELECT DEPT_NAME, MAX(SALARY) AS MAXIMUM_SALARY FROM EMPLOYEE GROUP BY DEPT_NAME ) dept_max ON e.DEPT_NAME = dept_max.DEPT_NAME AND e.SALARY = dept_max.MAXIMUM_SALARY
内容的提问来源于stack exchange,提问作者PranaV
相关产品推荐
相关产品推荐

