【问题标题】:SQL "more than one row returned by a subquery used as an expression" error on count subquerySQL“子查询返回多行用作表达式”计数子查询错误
【发布时间】:2021-12-23 00:57:04
【问题描述】:

所以我正在尝试加入单列计数的子查询:

​(SELECT count(u.id) FROM companies_company cc FULL JOIN auth_user u on u.company_id = cc.id FULL JOIN auth_user_groups ug ON ug.user_id= u.id FULL JOIN auth_group g ON g.id = ug.group_id  WHERE cc.deactivated is null and (email is null) GROUP BY cc.id ORDER BY cc.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 companies_company cc FULL JOIN auth_user u on u.company_id = cc.id FULL JOIN auth_user_groups ug ON ug.user_id= u.id FULL JOIN auth_group g ON g.id = ug.group_id  WHERE cc.deactivated is null and (email is null) GROUP BY cc.id ORDER BY cc.id) 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
    ORDER BY cc.id

但我收到错误“用作表达式的子查询返回了不止一行”... 这是出乎意料的

(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 companies_company cc FULL JOIN auth_user u on u.company_id = cc.id FULL JOIN auth_user_groups ug ON ug.user_id= u.id FULL JOIN auth_group g ON g.id = ug.group_id  WHERE cc.deactivated is null and (email is null) GROUP BY cc.id ORDER BY cc.id) as number_of_full_users,

【问题讨论】:

  • 子查询与外部查询无关,因此它将在外部查询的每一行返回多行。您应该在子查询中给companies_company 一个不同的别名(否则,cc 是什么,内表还是外表?),并添加类似WHERE cc2.id = cc.id 的内容。为什么所有FULL JOINS
  • 太棒了,谢谢伙计!
  • 如果有人在评论中回答您,请让他们将其发布为答案或将其发布为答案。但我知道你在评论说评论不回答是有帮助的。可以单击评论的向上箭头表示同意。但是 cmets 不是永久性的。特别是“感谢”cmets。我提到点击/接受答案只是为了确保您知道。

标签: sql postgresql join


【解决方案1】:

因为您在第三个查询行中使用了 group by,并且此查询计算每个 cc.id 的计数,它可能返回多行

SELECT count(u.id) 
FROM 
  companies_company cc 
  FULL JOIN auth_user u on u.company_id = cc.id 
  FULL JOIN auth_user_groups ug ON ug.user_id= u.id 
  FULL JOIN auth_group g ON g.id = ug.group_id  
WHERE cc.deactivated is null and (email is null) 
GROUP BY cc.id 
ORDER BY cc.id

如果不需要 group by 只需要 count 删除 group byorder by

正确查询

SELECT count(u.id) 
FROM 
  companies_company cc 
  FULL JOIN auth_user u on u.company_id = cc.id 
  FULL JOIN auth_user_groups ug ON ug.user_id= u.id 
  FULL JOIN auth_group g ON g.id = ug.group_id  
WHERE cc.deactivated is null and (email is null) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    相关资源
    最近更新 更多