如何粘合两个依赖表?

时间:2017-07-05 15:36:05

标签: sql postgresql outer-join

我有客户和应用程序表。我想创建选择查询,它提供有关客户的信息,并计算用户在系统中的许多应用程序。

select distinct c.id, c.region, c.city, count(a.customer_id_id) 
from customers c
join applications a on c.id=a.customer_id_id
group by c.id; 

但是我得到一个错误,我需要按地区和城市进行分组,但我想显示每个应用程序的信息,而不是按地区和城市分组。因为以这种方式,我将为每个用户而不是每个用户组获得许多应用程序。 我读到可以使用嵌套查询和完全外连接,但我尝试过它并没有用。你能告诉我怎么做吗?

2 个答案:

答案 0 :(得分:1)

你很亲密。

  1. 使用LEFT OUTER JOIN,以便在Customers中包含0条记录的Applications(假设您的意图在这里)

  2. 不要同时使用DISTINCTGROUP BY。 Distinct表示“如果所有字段在此SELECT语句生成的记录集中的多个记录中的值相同,则只返回不同的记录,删除重复项”。取而代之的是GROUP BY,“按此字段列表分组。此列表中未包含的任何剩余字段将使用SELECT子句中的公式进行聚合,如count(a.customer_id_id)。”它们类似,但您不能仅使用DISTINCT聚合字段。

  3. 使用GROUP BY时,如果您不打算使用聚合公式(countsumavg等来汇总字段。)然后你必须把它包含在你的小组中。对于某些RDBMS(例如,旧版本的MySQL)来说,这不是必需的,但是这种做法很糟糕,因为未明确地与GROUP BY中缺少的公式聚合的字段就像告诉RDBMS“只需从匹配的记录中选择您希望的值,这可能会产生一些意想不到的后果。

  4. SELECT c.id, c.region, c.city, count(a.customer_id_id) 
    FROM customers c
        LEFT OUTER JOIN applications a on c.id=a.customer_id_id
    GROUP BY c.id, c.region, c.city; 
    

答案 1 :(得分:0)

不确定您的问题是什么。我假设区域和城市在功能上依赖于id(即id是候选键)。因此,较新版本的postgresql将接受您的查询。但是,如果您使用旧版本,则可以将group by子句扩展为:

select c.id, c.region, c.city, count(a.customer_id_id)  
from customers c
join applications a 
    on c.id=a.customer_id_id
group by c.id, c.region, c.city;

您说您希望显示有关每个应用程序的信息,但为什么要计算每个客户的应用程序数量?你的意思是:

select c.id, c.region, c.city, a.customer_id_id, a.<other attributes>  
from customers c
join applications a 
    on c.id=a.customer_id_id;