连接和计数来自不同表的行

时间:2019-07-23 11:42:49

标签: sql postgresql

因此,例如,我需要创建一个将材料与人相关联的报告视图。比方说属性和狗。 B和C之间没有连接

person

  • id
  • 名称

properties

  • id
  • 名称

dogs

  • id
  • 名称

要整理资料,我的报告如下:

select a.id, a.name, count(b.*), count(c.*) 
from person a 
  left join properties b on a.name = b.person 
  left join dogs c on a.name = c.person;

预期结果将是甲人拥有10头财产和20条狗。

以某种方式,这种连接完全增加了属性的数量,并说出了正确的狗的数量。如何修复联接?

1 个答案:

答案 0 :(得分:2)

快捷方法是使用count(distinct)

select a.id, a.name, count(distinct b.id), count(distinct c.id)
from table_a a left join
     table_b
     on a.name = b.person left join
     table_c c
     on a.name = c.person
group by a.id, a.name;

使用横向联接或子查询可能会更快-特别是如果两个表中有很多行:

select a.id, a.name,
       (select count(*)
        from b
        where a.name = b.person
       ),
       (select count(*)
        from c
        where a.name = c.person
       ),
from table_a a ;

顺便说一句,如果表a有一个id,则应使用该表链接到其他表,而不是name