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

SQL Server子查询报错:使用ANY运算符仍提示仅能指定一个表达式

错误原因解释

你的SQL报错核心有两点:

  1. ANY运算符要求子查询仅返回单列:
    ANY是用来拿主查询里的单个值(这里是max(time))和子查询返回的单列值集合做比较的。但你的子查询同时返回了emp_id和max(time)两列,SQL Server无法确定用主查询的时间和子查询里的哪个列对比,因此抛出了"只能指定一个表达式"的错误。

  2. 逻辑本身存在漏洞:
    就算把子查询改成只返回max(time),逻辑也不对——你现在是拿员工的最后进入时间和所有员工的最后离开时间比,而不是和该员工自己的最后离开时间比,这样会得到错误结果。比如如果员工A的最后离开时间比员工B的最后进入时间晚,员工B会被错误排除。

正确的SQL写法

写法一:关联子查询

select emp_id, max(time) as last_in_time
from hospital
where action = 'in'
group by emp_id
having max(time) > (
    -- 关联当前员工的最后离开时间,无离开记录则用早于所有时间的默认值
    select isnull(max(time), '1900-01-01')
    from hospital h_out
    where h_out.emp_id = hospital.emp_id
      and h_out.action = 'Out'
);

写法二:先聚合再筛选

with emp_status as (
    select 
        emp_id,
        -- 取每个员工最后进入时间
        max(case when action = 'in' then time end) as last_in,
        -- 取每个员工最后离开时间
        max(case when action = 'Out' then time end) as last_out
    from hospital
    group by emp_id
)
select emp_id, last_in
from emp_status
-- 最后进入时间晚于最后离开时间,无离开记录则默认算在场
where last_in > isnull(last_out, '1900-01-01');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:45:01