Sql 基于关系表从多个表中获取结果
我有dbo.Users表Sql 基于关系表从多个表中获取结果,sql,sql-server,relationship,Sql,Sql Server,Relationship,我有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.
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
将关系表视为用户和电话表之间的中间人。它是一个带有映射表的数据库。将用户加入到关系中,然后将关系加入到手机中
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,我的UserId是什么
关系:你好用户。我为您准备了PhoneId=10。我去打电话看看号码是多少
电话:你好!我有你的电话号码1234。它与您给我的PhoneId匹配。在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 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
可能需要一个
左连接
而不是内部连接
,以防记录不存在(显示没有电话号码的用户)@sqlmason在实际问题中没有提到要消除没有电话号码的用户,我想给出连接的多样性将有助于理解新手以便更好地理解。无论如何,谢谢3,Michael,NULL
您的查询不会显示此预期记录。@BHouse用户不包含PhoneId。用户和手机之间的关系表是多对多的。@BHouse只是为了让您了解我们在谈论什么。查看我为您制作的SQLFiddle:是否设置了PK/FK关系?这并不重要,但应该有。是的,PK/FK是设置好的。FK在关系表中,PK在用户和电话表中。感谢justiceorjustus的精彩解释,并感谢添加CitedToLearn的额外阅读@佩加兹很高兴我能帮忙
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