Postgresql
左外連接不返回分組查詢中的所有行
我正在嘗試查詢所有使用者以查找上個月的訂單價格。我在 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.date
從WHERE
子句移動到加入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