postgreSELECT DISTINCT查询占用的SQL太长



这是我下面的代码,执行起来需要很长时间。当我添加SELECT DISTINCT时,它会变得很长。

我试图做的是获得满足这些条件的唯一公司,并计算每个公司有多少个团队(这是由auth_useru表中给每个用户的team_id给出的(。

任何帮助都将是惊人的,我想学习如何制作更好的SQL查询。我知道GROUP BY是更好的方法,但我似乎不明白。

SELECT DISTINCT u.company_id, c.name, c.company_type, c.office_location, (SELECT (COUNT(DISTINCT u.team_id)) FROM auth_user u WHERE u.company_id = c.id GROUP BY u.company_id) as number_of_teams, s.status, h.auto_renewal
FROM auth_user u, companies_company c, subscriptions_subscription s, hubspot_company h
WHERE u.company_id = c.id
AND s.company_id = c.id
AND h.myagi_id = c.id
ORDER BY u.company_id ASC

首先重构查询,使用1992 JOIN语法,而不是爷爷的逗号联接语法。(我是爷爷,JOIN一上市,我就开始使用它。(

SELECT DISTINCT u.company_id, c.name, c.company_type, c.office_location, 
count_of_teams_TODO,
s.status, h.auto_renewal
FROM auth_user u
JOIN companies_company c ON u.company_id = c.id
JOIN subscriptions_subscription s ON  s.company_id = c.id
JOIN hubspot_company h ON h.myagi_id = c.id
ORDER BY u.company_id ASC;

那么,我相信每个用户都属于一个团队;即具有一个值CCD_ 1。你希望你的结果集显示公司有多少团队。

所以用COUNT(DISTINCT u.team_id) teams代替我的count_of_teams_TODO占位符,得到这个。不需要子查询。但对于聚合函数COUNT(),我们需要GROUP BY。我们希望按公司、状态和授权进行分组。

SELECT c.id, company_id, c.name, c.company_type, c.office_location, 
COUNT(DISTINCT u.team_id) teams,
s.status, h.auto_renewal
FROM auth_user u
JOIN companies_company c ON u.company_id = c.id
JOIN subscriptions_subscription s ON  s.company_id = c.id
JOIN hubspot_company h ON h.myagi_id = c.id
GROUP BY c.id, s.status, h.auto_renewal
ORDER BY u.company_id ASC;

研究GROUP BY和聚合函数。你花在更好地学习这些概念上的每一秒都会对你有所帮助。

就性能而言,先解决这个问题,然后再问另一个问题。用查询优化标记它,并在询问它之前阅读它。