【问题标题】:Joining table which may not exist with where clause使用 where 子句连接可能不存在的表
【发布时间】:2021-02-23 18:49:38
【问题描述】:

我有两张桌子。假设他们是:

table customers: id, name
table orders: id, customer_id, is_finished(boolean), order_sum 

我想加入来获取客户姓名,他/她完成的订单数量以及他/她总共花费的金额

所以我正在做这个 SQL 查询:

SELECT c.name,
       coalesce(count(o.id), 0)      AS orders_count,
       coalesce(sum(o.order_sum ), 0) AS total_spent
FROM customers c
         LEFT OUTER JOIN orders o on c.id = o.user_id
WHERE c.id = customer_id
  AND o.is_finished = true
GROUP BY c.name;

如果客户有任何已完成的订单,那么它将一切正常。

|'John'|3|150|

但如果没有订单或有订单未完成,则不会输出任何内容。但我想要的输出如下:

|'John'|0|0|

那么进行这样的查询的正确方法是什么,即使客户没有订单,我也能得到结果?

顺便说一句,我正在使用 postgreSQL

【问题讨论】:

    标签: sql postgresql count left-join where-clause


    【解决方案1】:

    只需将LEFT JOINed 表上的条件从WHERE 子句移至LEFT JOINON 子句 - 否则将变为强制性,并过滤掉没有匹配订单的客户:

    SELECT c.name,
        count(o.id)                    AS orders_count,
        coalesce(sum(o.order_sum ), 0) AS total_spent
    FROM customers c
    LEFT OUTER JOIN orders o ON c.id = o.user_id AND o.is_finished = true
    WHERE c.id = customer_id
    GROUP BY c.id, c.name;
    

    【讨论】:

    • 哇,这么简单的修复!谢谢!
    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    相关资源
    最近更新 更多