1

我有 3 张桌子。

Owner(owner_id, name)
House(code, owner_id, price)
Buyer(buyer_id, name)
Bought(buyer_id, code, 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)) 

我怎样才能使这项工作适用于所有业主?

4

1 回答 1

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以查看他们购买了谁的房子。

于 2013-08-31T15:44:17.993 回答