SQL Server: как получить данные из соединительной таблицы, в которой есть только идентификаторы?

У меня есть три таблицы (примеры здесь). Два с данными и один, представляющий собой соединительную таблицу для обработки отношений «многие:многие».

Пользователи:

ID | UserName
====================
1  | Jeremy Coulson
2  | Someone Else

Репозитории:

ID | RepositoryURI
====================
1  | http://something
2  | http://another

Пользователи репозиториев:

ID | UserID | RepositoryID
==========================
1  | 1      | 1
2  | 2      | 2

Итак, в этом примере пользователь 1 связан с репозиторием 1. Пользователь 2 связан с репозиторием 2. Теперь мне нужно выполнить поиск по Repositories.RepositoryURI и вернуть Users.UserName.

У меня есть этот запрос:

select UserName 
from RepositoriesUsers 
join Users on Users.ID = RepositoriesUsers.UserID
join Repositories on Repositories.RepositoryURI = 'http://another';

Но это возвращает каждую строку в таблице RepositroriesUsers.

Как я могу сопоставить данные между таблицей соединения с идентификаторами и другими таблицами с удобным для человека текстом?


person mrcoulson    schedule 05.10.2015    source источник
comment
я знаю, что у вас есть несколько хороших ответов ниже, но это могло бы иметь для вас больше смысла, если бы вы начали со стола, по которому вы фильтруете, и двигались вниз.. from Repositories r join RepositoriesUsers ru on r.Id = ru.RepositoryID join Users u on ru.UserId = u.Id where r.RepositoryURI = 'http://another   -  person JamieD77    schedule 05.10.2015


Ответы (3)


На самом деле вы не указываете правильное условие соединения для второго INNER JOIN. Так должно быть:

SELECT U.UserName 
FROM RepositoriesUsers RU
INNER JOIN Users U 
    ON U.ID = RU.UserID
INNER JOIN Repositories R 
    ON RU.RepositoryID = R.ID
WHERE R.RepositoryURI = 'http://another';

Кроме того, вы должны попытаться использовать псевдонимы таблиц в своих запросах для ясности.

person Lamak    schedule 05.10.2015
comment
Идеальный. Спасибо. Я вижу, что происходит сейчас. Я приму ваш ответ через семь минут :) - person mrcoulson; 05.10.2015

Я думаю, что для вашего соединения требуется простая коррекция:

select UserName 
from RepositoriesUsers  
join Users on Users.ID = RepositoriesUsers.UserID
join Repositories on Repositories.ID = RepositoriesUsers.RepositoryID
where Repositories.RepositoryURI = 'http://another';
person Pankaj Manek    schedule 05.10.2015
comment
Это правильно, но этот ответ уже был отправлен Ламаком. - person Sean Lange; 05.10.2015

Измените условие присоединения к таблице Repositories и добавьте предложение WHERE следующим образом.

select *
from RepositoriesUsers 
join Users on Users.ID = RepositoriesUsers.UserID
join Repositories on Repositories.ID = RepositoriesUsers.RepositoryID
where RepositoryURI = 'http://another'
person Eralper    schedule 05.10.2015
comment
Это правильно, но этот ответ уже был отправлен Ламаком. - person Sean Lange; 05.10.2015