Как отфильтровать вложенный запрос в T-SQL - PullRequest
1 голос
/ 12 августа 2011

У меня есть следующий сценарий:

  • 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"

ошибка.

Если я исключаю это и полагаюсь только на критерии объединения, подзапрос ВСЕГДА имеет одну и ту же первую строку и поэтому присоединяется только к одной из игр.

Надеюсь, я достаточно ясно дал понять, что кто-то может предложить ответ.

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

1 Ответ

2 голосов
/ 12 августа 2011
select G.GameUID, G.GameName, P.PlayerUID, P.PlayerName
from Game G inner join (
    select GameUID, MIN(FinishedPosition) as FinishedPosition
    from GamePlayer GP
    group by GP.GameUID) as V on V.GameUID = G.GameUID
inner join GamePlayer GP2 on (GP2.FinishedPosition = V.FinishedPosition and GP2.GameUID = V.GameUID)
inner join Player P on (P.PlayerUID = GP2.PlayerUID)

Вот так.Я думаю, что это делает?Дайте мне знать, если это не удастся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...