如何将两个表与 SQL Server 中第二个表中引用同一列的两列连接起来

Posted

技术标签:

【中文标题】如何将两个表与 SQL Server 中第二个表中引用同一列的两列连接起来【英文标题】:How can i join two tables with two columns that refers the same column in the second table in SQL Server 【发布时间】:2021-06-10 14:40:04 【问题描述】:

我有两个表要加入。

第一个表有两列

    记录所有者的用户 ID。 已分配用户的用户 ID。

第二个表有 userId 和 username 列。第一个表的这两列是指同一个表的同一列。我想在一个视图中查看两个用户名,但我无法同时获得它们。我该怎么做?

编辑

select
    TASKID,
    CREATED_BY,
    CREATED_AT,
    ASSIGNED_USER,
    USERNAME ,
    DEADLINE,
    USERNAME
from 
    TASKS
inner join 
    USERS on ASSIGNED_USER = USERID

我可以通过上面的查询得到ASSIGNED_USER的用户名。我已经尝试了第二个来获取两个用户名,但它没有用

select
    TASKID,
    CREATED_BY,
    CREATED_AT,
    ASSIGNED_USER,
    USERNAME ,
    DEADLINE,
    USERNAME
from 
    TASKS
inner join 
    USERS on ASSIGNED_USER = USERID and CREATED_BY = USERID

它返回一个空结果。

【问题讨论】:

“但我不能同时获得这些” 为什么不呢?你试过什么?为什么它不起作用? 【参考方案1】:

您必须加入用户两次,一次为 CREATED_BY,一次为 ASSIGNED_USER:

select
    TASKID,
    CREATED_BY,
    CREATED_AT,
    ASSIGNED_USER,
    USERNAME ,
    DEADLINE,
    USERNAME
from TASKS
inner join USERS u1 on ASSIGNED_USER = u1.USERID 
inner join USERS u2 on CREATED_BY = u2.USERID

【讨论】:

【参考方案2】:

加入 USERS 两次以解码不同的引用

select TASKID, CREATED_BY, CREATED_AT, ASSIGNED_USER, au.USERNAME assignedUser_Name, DEADLINE,  uc.USERNAME createdByUser_Name
from TASKS t
inner join USERS au
on t.ASSIGNED_USER = au.USERID 
inner join USERS uc
on t.CREATED_BY = uc.USERID

【讨论】:

以上是关于如何将两个表与 SQL Server 中第二个表中引用同一列的两列连接起来的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Join 表与第一个表中的日期范围和第二个表中的日期

sql server 2000返回在第一个表中但不在第二个表中的数据

T-SQL:比较两个表 - 第二个表中不存在的记录

SQL 视图:将初始表与分析表进行比较以返回初始表中不存在的值

将第二个表中的第二个(条件)结果添加到 SQL 查询

如何在 SQL Server 中加入两个查询的结果?