关系划分 - SQL

时间:2013-08-31 15:33:36

标签: sql relational-division

我有3张桌子。

所有者(owner_id,姓名)
房子(代码,所有者_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)) 

我如何为所有业主开展这项工作?

1 个答案:

答案 0 :(得分: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以查看他们购买的房屋。