Соединение с двумя одинаковыми внешними ключами

#sql #sql-server #join #select

#sql #sql-сервер #Присоединиться #выберите

Вопрос:

У меня есть эта таблица ниже

 Table Assignments
AssignmentID:  int
LinkedTo:  varchar(50)
AssignedUser:  int
AssignedBy:  int
 

где AssignedBy и AssignedUser — это внешние ключи из таблицы Users . Вот что Users выглядит так

 UserKey:int
Username:varchar(50)
 

Как я могу выполнить внутреннее соединение, где я получаю оба AssignedBy и AssignedUser ?
Следующее дает мне один из них, но как я могу получить оба? Кстати AssignedBy , и AssignedUser это два разных Users . Я пытаюсь получить Users.Username

 select Users.Username
from Assignments
INNER JOIN Users ON Assignments.UserKey = Users.UserKey
 

Ответ №1:

Если вы хотите, чтобы оба имени пользователя были в одной строке, вам нужно присоединиться Users дважды, например

 SELECT UA.Username AS AssignedUserName, UB.Username AS AssignedByUserName
    FROM Assignments A
    INNER JOIN Users UA ON A.AssignedUser = UA.UserKey
    INNER JOIN Users UB ON A.AssignedBy = UB.UserKey;
 

Если ваша цель состоит в том, чтобы иметь все имена пользователей, независимо от того, откуда они AssignedUser или откуда AssignedBy , вы должны использовать UNION

 SELECT U.Username
    FROM Assignments A
    INNER JOIN Users U ON A.AssignedUser = U.UserKey
UNION SELECT U.Username
    FROM Assignments A
    INNER JOIN Users U ON A.AssignedBy = U.UserKey;
 

Однако обратите внимание, что это приведет к удалению повторяющихся имен пользователей. Если вы хотите сохранить дубликаты, используйте UNION ALL .

Ответ №2:

Вам нужно два соединения:

 SELECT assigned.username AS assigned_username
       assigned_by.username AS assigned_by_username
FROM   assignments a
JOIN   users assigned ON a.assigneduser = assigned.userkey
JOIN   users assigned_by ON a.assignedby = assigned_by.userkey