T-SQL 选择连接 3 个表

Tim*_*ton 4 sql t-sql sql-server join

我目前正在 SQL Server 2012 上的 T-SQL 中进行选择查询。这是一个复杂的查询,我想从 3 个表中查询一个列表。结果应该是这样的:

期望输出:

ProjectId |    Title    | Manager   | Contact   | StatusId 
----------+-------------+-----------+-----------+-----------
1         |   projectX  |   1123    |  4453     |  1 
2         |   projectY  |   2245    |  5567     |  1
3         |   projectZ  |   3335    |  8899     |  1
Run Code Online (Sandbox Code Playgroud)

我的 3 个表:

1)项目: ProjectId、ProjectDataId、MemberVersionId
2)项目数据: ProjectDataId、Title、StatusId
3)成员: MemberId、MemberVersionId、MemberTypeId、EmployeeId

棘手的部分是实现版本控制。因此,随着时间的推移,项目 Members 可能会发生变化,并且应该始终可以返回到以前的版本,这就是我使用MemberVersionId作为ProjectMembers 之间的外键的原因。表 Project 和 ProjectData 与 ProjectDataId 链接。

因此,1 个项目有 1 个 OfferData,1 个项目有 N 个成员。

一些示例数据:
项目

ProjectId | ProjectDataId | MemberVersionId | 
----------+---------------+-----------------+
1         |   2           |   1             | 
2         |   3           |   1             |
3         |   4           |   1             |
Run Code Online (Sandbox Code Playgroud)

项目数据

ProjectDataId |    Title    | StatusId 
--------------+-------------+-----------
2             |   projectX  |  1 
3             |   projectY  |  1
4             |   projectZ  |  1
Run Code Online (Sandbox Code Playgroud)

成员: MemberTypeId 1 = 经理,MemberTypeId 2 = 联系人,3 = 其他

MemberId | MemberVersionId | MemberTypeId | EmployeeId | 
---------+-----------------+--------------+------------+
1        |   1             |   1          |  1123      | 
2        |   1             |   2          |  4453      |
3        |   1             |   3          |  9999      |
4        |   2             |   1          |  2245      | 
5        |   2             |   2          |  5567      | 
6        |   2             |   3          |  9999      | 
7        |   3             |   1          |  3335      | 
8        |   3             |   2          |  8899      | 
9        |   3             |   3          |  9999      | 
Run Code Online (Sandbox Code Playgroud)

我当前的查询如下所示:

SELECT ProjectId, Title, EmployeeId AS Manager, EmployeeId AS Contact, StatusId
FROM [MySchema].[Project] a,
     [MySchema].[ProjectData] b,
     [MySchema].[Members] c
WHERE a.ProjectDataId = b.ProjectDataId
  AND a.MemberVersionId = c.MemberVersionId
Run Code Online (Sandbox Code Playgroud)

不幸的是,这还不起作用。你知道如何解决这个问题吗?

谢谢

Ric*_*ell 5

像这样的东西?

SELECT 
    p.ProjectId, 
    pd.Title, 
    mm.EmployeeId AS Manager, 
    mc.EmployeeId AS Contact, 
    pd.StatusId
FROM 
    [MySchema].[Project] p
    INNER JOIN [MySchema].[ProjectData] pd ON pd.ProjectDataId = p.ProjectDataId
    INNER JOIN [MySchema].[Members] mm ON mm.MemberVersionId = p.MemberVersionId AND mm.MemberTypeId = 1
    INNER JOIN [MySchema].[Members] mc ON mc.MemberVersionId = p.MemberVersionId AND mc.MemberTypeId = 2;
Run Code Online (Sandbox Code Playgroud)