SQL «более одной строки, возвращаемой подзапросом, используемым в качестве выражения» ошибка при подсчете подзапросов

#sql #postgresql #join

Вопрос:

поэтому я пытаюсь объединить этот подзапрос в один столбец подсчетов:

 ​(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,  

Комментарии:

1. Подзапрос не связан с внешним запросом, поэтому он возвращает несколько строк на строку внешнего запроса. Вы должны указать companies_company другой псевдоним в подзапросе (в противном случае, что такое cc внутренняя или внешняя таблица?) и добавить что-то вроде WHERE cc2.id = cc.id . И почему все FULL JOINS это ?

2. потрясающе, спасибо, приятель, это сработало !!

3. Если кто-то ответит вам в комментарии, попросите его опубликовать его в качестве ответа или опубликовать его в качестве ответа. Но я понимаю, что вы комментировали, что комментарий без ответа был полезен. Можно нажать на стрелку вверх комментария, чтобы согласиться. Но комментарии не являются постоянными. Особенно комментарии «спасибо». Я упомянул о нажатии/принятии ответа просто для того, чтобы убедиться, что вы знали об этом.

Ответ №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  

Если нет необходимости группировать по и просто нужно подсчитать, удалите группу по и закажите по

Правильный запрос:

 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)