SQL Server JOIN - 在一个查询中显示两个连接的值,映射到另一个表?

Dir*_*dNJ 1 t-sql sql-server

以下是我正在使用的数据集的示例.我正在尝试编写一个查询,允许我从items表中请求一行,并在users表中显示User Name来代替用户id:

Table 1 - users table

User ID | User Name 
--------------------
12      | Fred
13      | Ted
14      | Ned

Table 2 - items Table

Item ID | Submitted User | Assigned User
----------------------------------------
234     | 12             | 14
345     | 12             | 13
456     | 14             | 12
Run Code Online (Sandbox Code Playgroud)

这是我能得到的,它返回一个正确标记的用户名:

SELECT users.[user name] AS [Submitted User] FROM items 
JOIN users ON items.[Assigned User] = users.[User ID]
WHERE items.[Item ID] = '234'
Run Code Online (Sandbox Code Playgroud)

这个问题是,当一个字段工作时,我需要同时获得提交的用户和分配的用户.我试图在一个查询中做到这一点......我有一种感觉它可以做到,但我只是不确切知道如何.如果我尝试多次分配字段,我会收到关于相关性的错误.这是我尝试的一个示例,它给出了一个相关错误:

SELECT users.[user name] AS [Submitted User], users.[user name] AS [Assigned User] FROM items 
JOIN users ON items.[Submitted User] = users.[User ID]
JOIN users ON items.[Assigned User] = users.[User ID]
WHERE items.[Item ID] = '234'
Run Code Online (Sandbox Code Playgroud)

这正是我想要做的:

SELECT 
  items[Submitted User].users.[user name] AS [Reported User],
  items[Assigned User].users.[user name] AS [Assigned User] 
WHERE items.[Item ID] = '234'</pre>
Run Code Online (Sandbox Code Playgroud)

这是我想要得到的回应:

Submitted User | Assigned user
Fred           - Ted
Run Code Online (Sandbox Code Playgroud)

deb*_*gme 6

您想为JOIN表添加别名,以便可以连接两次.见下文:

SELECT 
    submitted.[user name] AS [Submitted User], 
    assigned.[user name] AS [Assigned User] 
FROM items 
    LEFT JOIN users submitted ON items.[Submitted User] = submitted.[User ID]
    LEFT JOIN users assigned ON items.[Assigned User] = assigned.[User ID]
WHERE items.[Item ID] = '234'
Run Code Online (Sandbox Code Playgroud)

其他一些建议:

  • 表2的列名应该是"提交的用户ID","已分配的用户ID",以使您更加明确地表示您正在加入ID.
  • 您可能希望将ID字段设为INT.它可以实现更快的连接和更少的空间.
  • 不要忘记在两个表的ID字段上构建索引,以便JOIN可以利用它们.
  • 感谢astander,改为加入LEFT JOIN,因为你可能想看到结果