У меня есть следующий сценарий:
Game
имеет GameUID, GameName
Player
имеет PlayerUID, PlayerName
GamePlayer
имеет GamePlayerUID, GameUID, PlayerUID, FinishedPosition
Мне нужно вернуть обратно одну строку соединения между этими тремя таблицами для каждой строки Игры, где строка возврата содержит строку Игрока с самой низкой готовой позицией.
Пример
Игра
{some guid}, Game 1
{some guid}, Game 2
{some guid}, Game 3
Игрок
{some guid}, Player 1
{some guid}, Player 2
GamePlayer
{some guid}, {game 1 guid}, {player 1 guid}, 1
{some guid}, {game 1 guid}, {player 2 guid}, 2
{some guid}, {game 2 guid}, {player 1 guid}, 2
{some guid}, {game 2 guid}, {player 2 guid}, 1
Мой ожидаемый результат будет
Result
-------
{game 1 guid}, Game 1, {player 1 guid}, Player 1
{game 2 guid}, Game 2, {player 2 guid}, Player 2
Теперь мои инстинкты говорят мне, что это должен быть запрос:
select G.GameUID, G.GameName, V.PlayerUID, P.PlayerName
from Game G inner join (
select top(1) GameUID, PlayerUID
from GamePlayer GP
where GP.GameUID = G.GameUID
order by FinishedPosition asc) as V on V.GameUID = G.GameUID
inner join Player P on V.PlayerUID = P.PlayerUID
Теперь проблема этого запроса в том, что where GP.GameUID = G.GameUID
приводит к
Не удалось связать идентификатор из нескольких частей "G.GameUID"
ошибка.
Если я исключаю это и полагаюсь только на критерии объединения, подзапрос ВСЕГДА имеет одну и ту же первую строку и поэтому присоединяется только к одной из игр.
Надеюсь, я достаточно ясно дал понять, что кто-то может предложить ответ.
Кстати, это помещается в представление. Я не хочу писать хранимый процесс для этого, за исключением случаев, когда это абсолютно необходимо.