SQL Server:多次加入同一列
我正在尝试从两个表中的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 我希望得到以下结果:
资源
:
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