【问题标题】:SQL Many-to-many relationship in 2 tables2个表中的SQL多对多关系
【发布时间】:2021-08-19 13:13:30
【问题描述】:

我希望能得到一些有关 SQL 的帮助。

问题:

有 2 个表 - Homes 和 Owners。

家:

ID Name Address Type
1 home1 Street1 Type1
2 home2 Street2 Type2

所有者:

ID_home Name Ocupation Sallary
1 BOB Builder 6942
2 Jorge Singer 500
2 Mike Artist 1000

房屋可以由多个所有者拥有,并且所有者可以拥有多个房屋。 Id 是每个家庭的唯一标识符,并且在两个表中都对应。

我将如何编写一个返回拥有超过 1 个业主的房屋(以及各自的业主)的查询。

这种情况下的预期结果是:

ID Name Address Type Name Ocupation Type
2 home2 Street2 Type2 Jorge Singer 500
2 home2 Street2 Type2 Mike Artist 1000

提前致谢!

【问题讨论】:

  • 如果房屋由多个所有者拥有,并且所有者可以拥有多个房屋,则数据模型中缺少多对多表(如果您想对其进行规范化)
  • 您的数据模型实际上不是多对多,而是多对一。例如,您如何代表拥有两栋房屋的业主?
  • @Alejandro 重复数据。正如我在之前的评论中所说,这是可能的,但不是标准化的(当然不推荐)

标签: sql postgresql


【解决方案1】:

只要通过这个简单的查询,你就可以得到你想要的

select *
from owners o
  join homes h
    on h.ID = o.ID_home
where Id_home in ( 
  select o.Id_home
  from owners o
  group by o.Id_home
  having count(*) > 1
)

子选择返回那些在owners 表中出现多次的主标识符。

【讨论】:

  • 这是我需要的。非常感谢!
【解决方案2】:

如果您想在这两个表之间建立多对多关系,则需要创建另一个表“Home_Owners”(否则您只有一对多关系):

Home_id Owner_id
1 1
2 2
3 2

因此,现在您可以为一所房子拥有多个所有者,也可以为一个所有者拥有多个房子。此外,您不应该像以前那样在“所有者”表中声明“ID_home”。

那么您的 SQL 脚本可能如下所示:

SELECT * FROM owners
LEFT JOIN home_owners ON home_owners.owner_id = owner.id
LEFT JOIN homes ON home_owners.home_id = home.id
WHERE owners.id IN
(SELECT owners.id FROM home_owners GROUP BY owners.id HAVING COUNT(*) > 1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多