我有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))
我如何为所有业主开展这项工作?
答案 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
以查看他们购买的房屋。