如何修复报子查询多列返回错误的SQL查询语句?
错误原因
- 核心语法问题:你放在SELECT列表中的三个子查询每个都返回了
CREATEDBY、统计值两列,且每个子查询会返回多行结果(每个创建人对应一行),SQL语法明确要求,非EXISTS引入的子查询如果放在字段列表中,只能返回1行1列的标量结果,这是你触发报错的直接原因。 - 细节语法错误:所有
CREATEDBY IN ('Adam', 'John', 'Molly'语句都缺少右括号,即使解决了子查询问题也会触发语法报错。
修正方案
推荐使用条件聚合写法,仅需扫描一次表,执行效率远高于多子查询写法,完全满足你按创建人统计不同时间段新增客户数的需求:
SELECT CREATEDBY, SUM(CASE WHEN CREATEDAT BETWEEN '2021-06-17' AND '2021-07-17' THEN 1 ELSE 0 END) AS FIRSTMONTH, SUM(CASE WHEN CREATEDAT BETWEEN '2021-07-17' AND '2021-08-17' THEN 1 ELSE 0 END) AS SECONDMONTH, SUM(CASE WHEN CREATEDAT BETWEEN '2021-08-17' AND '2021-09-17' THEN 1 ELSE 0 END) AS THIRDMONTH FROM CUSTOMERSTABLE WHERE CREATEDBY IN ('Adam', 'John', 'Molly') AND CREATEDAT BETWEEN '2021-06-17' AND '2021-09-17' GROUP BY CREATEDBY
补充提示
如果你的CREATEDAT字段包含时分秒格式,建议将时间判断逻辑从BETWEEN改为左闭右开写法,避免遗漏对应结束日期当天有时分秒的记录,示例:CASE WHEN CREATEDAT >= '2021-06-17' AND CREATEDAT < '2021-07-18' THEN 1 ELSE 0 END
内容的提问来源于stack exchange,提问作者Olly O'neil
相关产品推荐
相关产品推荐

