SQL多对多关系查询:获取拥有多个所有者的房屋及对应所有者信息
嘿,我来帮你搞定这个SQL查询需求!要找出那些拥有超过1个所有者的房屋,同时返回这些房屋的详细信息以及对应的所有所有者数据,这里有两种实用的方法:
方法一:子查询结合分组筛选
这种方法兼容性很好,几乎所有主流数据库都支持:
SELECT h.ID, h.Name, h.Address, h.Type, o.Name, o.Ocupation, o.Sallary FROM Homes h INNER JOIN Owners o ON h.ID = o.ID_home WHERE h.ID IN ( -- 先筛选出所有者数量>1的房屋ID SELECT ID_home FROM Owners GROUP BY ID_home HAVING COUNT(*) > 1 );
思路拆解:
- 内层子查询:通过
GROUP BY ID_home把所有者按房屋分组,再用HAVING COUNT(*) > 1挑出那些有多个所有者的房屋ID。 - 外层查询:把Homes和Owners表关联起来,只保留子查询里筛选出来的房屋数据,这样就能拿到这些房屋对应的所有所有者信息了。
方法二:窗口函数实现(更灵活)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),可以用这种更优雅的方式:
WITH home_owner_stats AS ( SELECT *, -- 按房屋分组统计每个房屋的所有者数量 COUNT(*) OVER (PARTITION BY ID_home) AS total_owners FROM Owners ) SELECT h.ID, h.Name, h.Address, h.Type, o.Name, o.Ocupation, o.Sallary FROM Homes h INNER JOIN home_owner_stats o ON h.ID = o.ID_home WHERE o.total_owners > 1;
思路拆解:
- 先用CTE创建一个临时数据集,给每条所有者记录加上对应房屋的总所有者数(
PARTITION BY ID_home就是按房屋分组统计)。 - 然后关联Homes表,筛选出总所有者数大于1的记录,直接得到你要的结果。
两种方法最终都会输出你预期的结果:
ID Name Address Type Name Ocupation Sallary
2 home2 Street2 Type2 Jorge Singer 500
2 home2 Street2 Type2 Mike Artist 1000
内容的提问来源于stack exchange,提问作者BeraPower
相关产品推荐
相关产品推荐

