SQL Server子查询报错:使用ANY运算符仍提示仅能指定一个表达式
错误原因解释
你的SQL报错核心有两点:
ANY运算符要求子查询仅返回单列:
ANY是用来拿主查询里的单个值(这里是max(time))和子查询返回的单列值集合做比较的。但你的子查询同时返回了emp_id和max(time)两列,SQL Server无法确定用主查询的时间和子查询里的哪个列对比,因此抛出了"只能指定一个表达式"的错误。逻辑本身存在漏洞:
就算把子查询改成只返回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
相关产品推荐
相关产品推荐

