Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于关系表从多个表中获取结果_Sql_Sql Server_Relationship - Fatal编程技术网

Sql 基于关系表从多个表中获取结果

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.

我有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

将关系表视为用户和电话表之间的中间人。它是一个带有映射表的数据库。将用户加入到关系中,然后将关系加入到手机中

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