SQL聚合查询子查询返回两行致计数报错的解决方法
问题背景
我有如下数据表:
需求为编写SQL语句,统计m1市政区参与投票的选民总人数,统计规则为以idcard作为选民唯一标识计数。已知m1市政区下辖1、2两个选区,两个选区内的选民互不重叠。
初始编写的SQL代码如下:
SELECT COUNT(idcard) FROM Census WHERE ndistrict = (SELECT ndistrict FROM Polling WHERE name='m1')
运行异常原因:内层子查询会返回2行选区数据,=运算符仅支持匹配单个标量值,无法匹配多行结果集,导致查询执行失败,需要对语句进行修正。
修正方法
核心问题是单行匹配运算符=无法处理子查询返回的多行结果,有两种标准修正方案:
方案1:使用
IN运算符替换=IN运算符专门用于匹配指定值集合内的任意元素,可直接兼容子查询返回的多行结果,修改后语句如下:SELECT COUNT(DISTINCT idcard) FROM Census WHERE ndistrict IN (SELECT ndistrict FROM Polling WHERE name='m1')补充说明:若确认
Census表中每个idcard仅对应一条记录、不存在重复数据,可去掉DISTINCT直接写COUNT(idcard);加上DISTINCT是更严谨的防御性写法,可避免重复数据导致计数虚高。方案2:使用内连接关联两表查询
通过选区编号字段关联选民表和选区表,直接筛选m1市政区对应的选民记录,语义更直观,也方便后续扩展查询其他市政区相关字段,语句如下:SELECT COUNT(DISTINCT c.idcard) FROM Census c JOIN Polling p ON c.ndistrict = p.ndistrict WHERE p.name = 'm1'
内容的提问来源于stack exchange,提问作者WolfyLinky
相关产品推荐
相关产品推荐

