我有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 by
0包括在内,看看他们买了谁的房子。