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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:22:21