SQL count子查询报"more than one row returned by a subquery used as an expression"问题咨询
问题原因与修复方案
报错核心原因
两个子查询的关联逻辑存在本质差异:
- 可正常运行的
number_of_real_users属于相关子查询:子查询内没有重新定义公司表别名cc,WHERE条件中cc.id = u.company_id引用的是外层主查询的当前行公司ID,因此每对应主查询的一行,子查询只会返回单个计数值,符合单值表达式的要求。 - 报错的
number_of_full_users属于独立子查询:你在子查询内部重新声明了FROM companies_company cc,该别名和外层主查询的公司表完全无关联,再加上子查询自身携带GROUP BY cc.id逻辑,会一次性返回所有未停用公司的计数结果(符合条件的公司有多少个就返回多少行),自然不符合主查询字段位置要求的单值返回规则。
此外子查询中的email is null未指定所属表,还存在字段歧义隐患。
修复代码
删掉子查询内部重复的公司表引用,直接关联外层主查询的公司ID即可,修改后的完整主查询如下:
SELECT cc.id , cc.name, (SELECT count(*) from auth_user u where cc.id = u.company_id and u.email is null) as number_of_real_users, (SELECT count(u.id) FROM auth_user u FULL JOIN auth_user_groups ug ON ug.user_id= u.id FULL JOIN auth_group g ON g.id = ug.group_id WHERE u.company_id = cc.id AND u.email is null) as number_of_full_users, ss.user_permissions_enabled, cc.company_type FROM companies_company cc FULL JOIN subscriptions_subscription ss on ss.company_id = cc.id WHERE cc.deactivated is null GROUP BY cc.id, cc.name, ss.user_permissions_enabled, cc.company_type ORDER BY cc.id
注:原主查询
cc.company_type后多了一个多余的逗号,同时GROUP BY遗漏了cc.company_type字段,上述代码也同步做了修正。
内容的提问来源于stack exchange,提问作者Liveinskin123
相关产品推荐
相关产品推荐

