Postgresql

左外連接不返回分組查詢中的所有行

  • June 30, 2021

我正在嘗試查詢所有使用者以查找上個月的訂單價格。我在 PostgreSQL 上做這個。這是一個顯示我的問題的玩具數據庫:我有一個people表和一個orders表。我正在嘗試查找上個月所有人的訂單總和。

這是我的數據:

select * from people;
id |     name     
----+--------------
 1 | bobby lee
 2 | greg grouper
 3 | Hilldawg Ca
(3 rows)

select * from orders;
id | person_id |    date    | price 
----+-----------+------------+-------
 1 |         3 | 2014-08-20 |  3.50
 2 |         3 | 2014-09-20 |  6.00
 3 |         3 | 2014-09-10 |  7.00
 4 |         2 | 2014-09-10 |  7.00
 5 |         2 | 2014-08-10 |  2.50

這是我要寫的查詢:

SELECT p.id, p.name, sum(o.price)
FROM people p
LEFT OUTER JOIN orders o
ON p.id = o.person_id
WHERE o.date between date '2014-09-01' AND date '2014-09-30'
GROUP BY p.id;

這是我得到的回報:

id |     name     |  sum  
----+--------------+-------
 2 | greg grouper |  7.00
 3 | Hilldawg Ca  | 13.00
(2 rows)

我期待第三行,人 id 1(bobby lee)上個月的訂單總和為零(因為 bobby 沒有訂單)。我的查詢做錯了什麼?我的印像是進行左外連接和分組people.id意味著people表應該設置輸出中的行數。

WHERE o.date ...條件使外連接表現得像內連接,刪除任何在people中沒有至少一個匹配行的行orders

您必須將條件o.dateWHERE子句移動到加入ON

SELECT p.id, p.name, coalesce(sum(o.price), 0.00) AS total
FROM people p
 LEFT OUTER JOIN orders o
   ON  p.id = o.person_id
   AND o.date BETWEEN date '2014-09-01' AND date '2014-09-30'
GROUP BY p.id;

測試:SQLFiddle

引用自:https://dba.stackexchange.com/questions/80006