Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 Server:多次加入同一列_Sql_Sql Server - Fatal编程技术网

SQL Server:多次加入同一列

SQL Server:多次加入同一列,sql,sql-server,Sql,Sql Server,我正在尝试从两个表中的SQL Server获取并连接信息 假设我有两张桌子: 表资源: ID Resource --------------- 1 Alex 2 Dennis 3 Diane 表项目: Project Manager Leader Engineer ------------------------------------------ pro_18001 1 2 3 我希望得到以下结果:

我正在尝试从两个表中的SQL Server获取并连接信息

假设我有两张桌子:

资源

ID    Resource
---------------
1     Alex
2     Dennis
3     Diane
项目

Project      Manager    Leader    Engineer
------------------------------------------
pro_18001    1          2         3
我希望得到以下结果:

Project        Manager    Leader    Engineer
---------------------------------------------
pro_18001      Alex       Dennis    Diane
我认为SQL查询应该如下所示:

SELECT
  [Projects].[Project]
  [Resources].[Resource]
  [Resources].[Resource]
  [Resources].[Resource]
FROM
  [Projects]
LEFT JOIN
  [Resources] ON
    [Projects].[Manager] = [Resources].[ID] AND
    [Projects].[Leader] = [Resources].[ID] AND
    [Projects].[Engineer] = [Resources].[ID]
WHERE
  [Project].[Projects] = 'pro_18001'
但是我确信下面的部分是不正确的,因为有3次相同的列,并且连接可能没有按照正确的顺序选择正确的列

SELECT
  [Projects].[Project]
  [Resources].[Resource]
  [Resources].[Resource]
  [Resources].[Resource]

那么如何在正确的位置多次连接同一列?

您需要为每列添加左连接3而不是1:

SELECT
  [Projects].[Project],
  Manager.[Resource] AS Manager,
  Leader.[Resource] AS Leader,
  Engineer.[Resource] AS Engineer
FROM [Projects]
LEFT JOIN [Resources] Manager
       ON [Projects].[Manager] = Manager.[ID]
LEFT JOIN  [Resources] Leader
       ON [Projects].[Leader] = Leader.[ID]
LEFT JOIN [Resources] Engineer
       ON [Projects].[Engineer] = Engineer.[ID]
WHERE [Project].[Projects] = 'pro_18001'

您可以尝试以下查询以获得所需结果

create table #Resources (Id int, Resources Varchar(20))
insert into #Resources 
values(1, 'Alex'), (2, 'Dennis'), ('3', 'Diane')

Create table #Projects (Project Varchar(20), Manager INT, Leader INT, Engineer INT)
insert into #Projects Values ('pro_18001', 1, 2, 3)

SELECT #Projects.Project,Manager.Resources as Manager,Leader.Resources as Leader, Engineer.Resources as Engineer FROM #Projects
INNER JOIN #Resources as Manager on #Projects.Manager = Manager.Id
INNER JOIN #Resources as Leader on #Projects.Leader = Leader.Id
INNER JOIN #Resources as Engineer on #Projects.Engineer = Engineer.Id

DROP TABLE #Resources
DROP TABLE #Projects
结果如下

Project     Manager Leader  Engineer
pro_18001   Alex    Dennis  Diane

希望这会对您有所帮助。

您必须多次加入表,这不是您试图实现的“数据透视表”:@ygorbunkov这不是数据透视。两个表中都不存在结果。
Resources
表必须为同一个项目返回不同的行。您使用的是MySQL还是MS SQL Server?@BobVandevliet bat7已经将此作为答案发布了。我怀疑OP想要左连接,以防其中一个资源不存在。事实上,这个查询不按项目的IDLeft join进行过滤,目前也将给出相同的结果,当数据不存在时,名称将为空或null,并且可以在那里使用ISNULL。@PanagiotisKanavos这肯定会让OP正确理解如何应用Suraj给出的答案。如果OP一直想要工作代码来修复他们的bug,他们可以去fiver?这个答案足够好,可以帮助任何有同样问题的人question@zuckerburg-谢谢你宝贵的反馈。谢谢,我只是需要做
选择经理。[Resource]作为经理
,而不仅仅是
选择经理。[Resource]
等等,为避免出现多个名称完全相同的列的结果,请编辑您的帖子并解释代码修复问题的原因/方式。目前,“仅代码”答案被视为低质量。这也将提高作者从错误中学习的机会。
SELECT
    p.project_name,
    r.name AS manager,
    r1.name AS leader,
    r2.name AS enginener
FROM
    projects p
INNER JOIN resources r ON
    p.manager = r.id
INNER JOIN resources r1 ON
    p.leader = r1.id
INNER JOIN resources r2 ON
    p.engineer = r2.id