2013-08-31 65 views
0

我有3個表格。關係部門 - SQL

所有者(owner_id,名)
府(代碼,owner_id,價格)
買家(buyer_id,名)
買(buyer_id,代碼,price_bought,date_bought)

我有以下查詢:
列出從某些所有者處購買所有房屋的買家的名字?

我知道怎麼找,如果有人買了所有從特定的所有者房子(說與ID = 1所有者):

SELECT name 
FROM buyer 
WHERE NOT EXISTS (SELECT code 
       FROM house 
       WHERE owner_id = 1 
         AND code NOT IN (SELECT code 
             FROM bought 
             WHERE bought.buyer_id= buyer.buyer_id)) 

我怎樣才能使這項工作的所有業主?

+0

'buying.code'是什麼意思? –

+0

這是正在購買房子的代碼。 –

+0

1)第一個「NOT EXISTS()」子查詢與主查詢不相關。 2)爲什麼要在第二個子查詢中使用NOT IN()而不是NOT EXISTS()? 3)爲了清晰起見_always_使用相關名稱(「別名」) – wildplasser

回答

2

句子:「列出從某個所有者那裏購買所有房屋的買家的名字?」。這可以被解釋爲兩種方式。 (1)買方購買的所有房屋來自一位業主。或(2)一位業主出售給同一買家的所有房屋。

以下回答(1):

select b.buyer_id 
from bought b join 
    house h 
    on b.code = h.code 
group by b.buyer_id 
having min(h.owner_id) = max(h.owner_id); 

答案第二個問題是類似的。但是,重點是業主而不是買家。

select min(b.buyer_id) 
from bought b join 
    house h 
    on b.code = h.code 
group by h.owner_id 
having min(b.buyer_id) = max(b.buyer_id); 

編輯:

在這兩種情況下,邏輯非常相似,但讓我們來看看第二個查詢。加入只是將買方和所有者ID結合在一起(不是很有趣)。

group by正在爲每個owner_id創建一行。然後,having子句將添加條件,即當最小買方和最大買方相同時,查詢僅返回owner id - 表示只有一個值。您也可以將此條件表示爲count(distinct buyer_id) = 1,但min()max()通常比count(distinct)表現得更好。

select子句然後返回這些買家。您還可以包括owner以查看他們購買的房屋。

+0

這是第二個。對不起,英文不是我的主要語言。謝謝! –

+0

你能解釋一下邏輯嗎?我不明白。 –