关系划分-SQL



我有3个表。

所有者(所有者id,名称)
房屋(代码、业主id、价格)
买方(买方id,名称)
买入(买方id,代码,价格买入,日期买入)

我有以下查询:
列出从某个业主那里购买所有房子的买家的名字?

我知道如何找到是否有人从某个特定的业主那里购买了所有的房子(比如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) 买方买的所有房子都是一个业主的。或(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);

编辑:

在这两种情况下,逻辑非常相似,但让我们看看第二个查询。join只是将买家和所有者id组合在一起(不是很有趣)。

CCD_ 1为每个CCD_ 2创建单个行。然后,having子句添加了一个条件,即当最小买家和最大买家相同时,查询仅返回owner id,这意味着只有一个值。您也可以将此条件表示为count(distinct buyer_id) = 1,但min()max()的性能通常比count(distinct)好一点。

select子句然后返回这些买家。你也可以把group by0包括在内,看看他们买了谁的房子。

最新更新