2013-05-14 86 views
0

我想從下表中獲取訂購至少兩個產品的客戶。該表是:左加入包含分組的查詢

Customer(Id, Name, City), 
Product(Id, Name, Price), 
Orders(Customer_Id, Product_Id, Date) 

我使用查詢

select c.* 
from customer c 
join orders o on o.customer_id = c.id 
group by c.id 
having count(o.customer_id) >= 2 

它返回預期的結果,但是當我LEFT JOIN更換JOIN它仍然提供了相同的結果。它不會按照LEFT JOIN的規定返回Customer表的所有行。爲什麼LEFT JOIN的功能限制在這個場合?由於有人無法區分來自匹配的結果和僅出現在左側表格中的結果?

+2

您正在表'orders'上使用過濾器嗎? (這是你正在使用的''',基本上使'left join'成爲'內部連接' – Lamak 2013-05-14 17:43:18

+0

你是否有一個可以證明這一點的樣本數據? – Woot4Moo 2013-05-14 17:43:51

+2

如果你只對至少有兩種產品的客戶感興趣爲什麼你想要一個左連接?這將保留零訂單的客戶(然後你消除在'有') – 2013-05-14 17:49:09

回答

2

您的左加入按預期方式工作,但您還有其他事情會影響加入的結果。

特別是,您的HAVING子句只接受在orders表(COUNT(o.customer_id) >= 2)中有兩個或更多匹配的客戶。當然,如果客戶沒有訂單,它將通過LEFT JOIN操作返回,但會被HAVING過濾掉 - 因爲COUNT(o.customer_id)會評估爲0。

如果你想返回有有沒有至少兩個數量級客戶的客戶,只是說這樣的查詢,無論是這樣的:

select c.* 
from customer c 
left join orders o on o.customer_id = c.id 
group by c.id 
having count(o.customer_id) >= 2 
    or count(o.customer_id) = 0 

,甚至是這樣的:

select c.* 
from customer c 
left join orders o on o.customer_id = c.id 
group by c.id 
having count(o.customer_id) <> 1 
0

o.customer_id在訂單表中沒有對應行的情況下爲空。 COUNT只計算非空值。嘗試COUNT(1)或COUNT(c.customer_id),看看你是否得到了預期的結果。

+1

它不會做一個如果他使用'COUNT(1)'或'COUNT(c.customer_id)',那麼區別在於他將'customer'表中的每一列分組,所以他不會得到多於一行,除非它實際上有多行table'Orders' – Lamak 2013-05-14 17:46:17

+0

使用count(c.id)> = 2或count(1)時,結果是完全一樣的,只有匹配的行在結果組中。 – arjacsoh 2013-05-14 17:49:30

+0

You are right。It's not the left加入這是我模仿結果。這是HAVING條款。 – maelstrom 2013-05-14 17:52:49