SQL Server JOIN - отображает два соединенных значения в одном запросе, которые сопоставляются с другой таблицей? - PullRequest
1 голос
/ 08 февраля 2010

Вот пример набора данных, с которым я работаю. Я пытаюсь написать запрос, который позволит мне запросить строку из таблицы элементов и отобразить имя пользователя из таблицы пользователей вместо идентификаторов пользователей:

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

Это насколько я могу получить, что возвращает одно правильно помеченное имя пользователя:

SELECT users.[user name] AS [Submitted User] FROM items 
JOIN users ON items.[Assigned User] = users.[User ID]
WHERE items.[Item ID] = '234'

Проблема в том, что хотя ОДНО поле работает, мне нужно получить и отправленного, и назначенного пользователя. Я пытаюсь сделать это одним запросом ... У меня такое чувство, что это можно сделать, но я просто не знаю точно, как. Если я пытаюсь присвоить поля более одного раза, я получаю ошибку о корреляции. Вот пример того, что я пробовал, что дает ошибку корреляции:

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'

Это именно то, что я пытаюсь сделать:

<code>SELECT 
  items[Submitted User].users.[user name] AS [Reported User],
  items[Assigned User].users.[user name] AS [Assigned User] 
WHERE items.[Item ID] = '234'

Вот ответ, который я пытаюсь получить:

Submitted User | Assigned user
Fred           - Ted

1 Ответ

6 голосов
/ 08 февраля 2010

Вы хотите создать псевдоним для своей таблицы 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'

Некоторые другие предложения:

  • В именах столбцов таблицы 2 должны быть введены идентификатор пользователя и назначенный идентификатор пользователя, чтобы было более очевидно, что вы присоединяетесь к идентификаторам.
  • Возможно, вы захотите сделать свои поля идентификатора INT. Это ускоряет соединения и уменьшает пространство.
  • Не забудьте построить индексы для полей идентификаторов в обеих таблицах, чтобы JOIN мог ими воспользоваться.
  • Спасибо astander, изменил присоединение к LEFT JOIN, так как вы, вероятно, хотите увидеть результаты
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...