【问题标题】:Get results from multiple tables based on relationship table根据关系表从多个表中获取结果
【发布时间】:2017-06-29 12:57:10
【问题描述】:

我有 dbo.Users 表

Id, Name
1, John
2, Mary
3, Michael

然后我有 dbo.Phones 表

Id, Phonenumber
10, 1234
11, 5555

然后我有 dbo.Relationship 表

Id, ChildId
1, 10
2, 11

我怎样才能做一个返回的查询

Id, Name, Phonenumber
1, John, 1234
2, Mary, 5555
3, Michael, NULL

这是我目前得到的。

SELECT u.Id, u.Name, p.Phonenumber
FROM dbo.Users as u
LEFT JOIN dbo.Phones as p
-- Something

SQL Fiddle

【问题讨论】:

  • 是否有PK/FK关系设置?没关系,但应该有。
  • 是的,PK/FK 已设置。关系表中的 FK 和用户和电话表中的 PK。

标签: sql sql-server relationship


【解决方案1】:

将关系表视为此处的用户表和电话表之间的中间人。它是一个带有映射表的many-to-many relationship。将您的用户加入到关系中,然后加入到您的电话的关系中。

SELECT u.Id
    ,u.Name
    ,p.PhoneNumber
FROM dbo.Users u
LEFT JOIN dbo.Relationship r ON r.Id = u.Id
LEFT JOIN dbo.Phones p ON p.Id = r.ChildId

可以这样想:

用户:您好,关系,我有 UserId = 1,我有哪些 PhoneId 用于该 UserId?

关系:您好用户。我有 PhoneId = 10 给你。我去和Phones通话看看号码是多少。

电话:嗨,Relationships!我有电话号码 1234 给你。它与你给我的 PhoneId 匹配。

【讨论】:

  • 感谢正义或正义的精彩解释,感谢 AddcitedToLearn 的额外阅读!
  • @Pegaz 很高兴我能帮上忙。 :)
【解决方案2】:

在 id 字段上加入它们。我会根据需要使用内部连接

SELECT distinct u.Id, u.Name, p.Phonenumber
FROM dbo.Users as u
LEFT JOIN dbo.Phones as p on u.id = p.id

或者---

 SELECT distinct u.Id, u.Name, p.Phonenumber
    FROM dbo.Users as u
    inner join T JOIN dbo.Phones as p on u.id = p.id
    inner join dbo.relationship r on r.id = u.id
where----

【讨论】:

  • 可能需要LEFT JOIN 而不是INNER JOIN,以防记录不存在(显示用户没有电话号码)
  • @sqlmason 在实际问题中没有提到要消除没有电话号码的用户,我认为提供多样性的连接将有助于理解新手以便更好地理解。还是谢谢
  • 3, Michael, NULL 您的查询不会显示此预期记录。
  • @BHouse 用户不包含 PhoneId。关系表是用户和电话之间的多对多。
  • @BHouse 这样您就可以看到我们在说什么。查看我为您制作的这个 SQLFiddle:SQL Fiddle
【解决方案3】:

试试这个:

Select u.Id, u.Name, p.Phonenumber
From
Users u 
Left join Relationship r on r.Id = u.Id
Left join Phones p on r.ChildId = p.Phonenumber

【讨论】:

    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    相关资源
    最近更新 更多