【问题标题】:multi-table query when there is no record in one table一张表没有记录时的多表查询
【发布时间】:2012-12-25 05:19:52
【问题描述】:

如果我想怎么办:

目前有A表和B表,

A:
id, name, address            //the id is unique
B
id, contact, email

由于一个人可能有多个联系人和邮箱,或者没有联系人和邮箱(即表B中没有记录)

现在我想计算每个 id 有多少条记录,甚至是 0: 结果将如下所示:

id, name, contact_email_total_count

我该怎么做(目前我唯一不知道的地方是如何计算 0 记录,因为表 B 中没有记录)?

【问题讨论】:

  • 表 A 和 B 的关系如何?在我看来,如果您离开加入,那么您将能够获得计数。

标签: sql postgresql


【解决方案1】:

对于这种情况,您需要使用LEFT JOIN,然后添加一个聚合和GROUP BY

select a.id, 
  a.name, 
  count(b.id) as contact_email_total_count
from tablea a
left join tableb b
  on a.id = b.id
group by a.id, a.name

SQL Fiddle with Demo

如果您在学习连接语法方面需要帮助,这里是一个很棒的 visual explanation of joins

根据您的评论,典型的order of execution 如下:

  1. 来自
  2. 开启
  3. 加入
  4. 在哪里
  5. 分组依据
  6. 选择
  7. 订购人

【讨论】:

  • 我想知道为什么即使表b中没有这样的id它仍然可以加入,当加入时,它不会满足“on a.id = b.id”跨度>
  • @Kuan 即左边表LEFT JOIN 的点tableA 将返回所有记录,即使它在tableb 中不存在。
  • 如果此答案有帮助,请务必通过其左侧的复选标记接受它。它可以帮助该网站的未来访问者,并且您会因为接受而获得代表。
  • 非常感谢!高炉。最后一个问题是:你能告诉我这条 SQL 行的执行顺序吗?我需要一些细节来了解这条线背后的原因。
  • @Kuan 看到我的编辑。网上有很多关于sql执行顺序的文章。
【解决方案2】:

需要做一个左连接来维护表A中的记录而不考虑B:

PostgreSQL: left outer join syntax

需要汇总B中的记录数:

PostgreSQL GROUP BY different from MySQL?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 2018-08-01
    相关资源
    最近更新 更多