je le scénario suivant:Comment filtrer requête imbriquée dans T-SQL
Game
aGameUID, GameName
Player
aPlayerUID, PlayerName
GamePlayer
aGamePlayerUID, GameUID, PlayerUID, FinishedPosition
Je dois revenir une rangée d'une jointure entre ces trois tables pour chaque rangée de jeu où la rangée de retour contient le joueur r ow avec la position finale la plus basse.
Exemple,
Jeu
{some guid}, Game 1
{some guid}, Game 2
{some guid}, Game 3
Joueur
{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
Mon résultat attendu serait
Result
-------
{game 1 guid}, Game 1, {player 1 guid}, Player 1
{game 2 guid}, Game 2, {player 2 guid}, Player 2
Maintenant, mon instinct me dit que cela devrait être la requête:
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
Maintenant, le problème avec cette requête est que where GP.GameUID = G.GameUID
résultats dans un
erreurL'identificateur en plusieurs parties "G.GameUID" n'a pas pu être lié
.
Si je ne comprennent pas la et se fonder uniquement sur les critères de jointure, la sous-requête a toujours la même première ligne et il rejoint seulement l'un des jeux.
J'espère avoir fait ce assez clair pour quelqu'un d'offrir une réponse.
BTW, cela est mis dans une vue. Je ne veux pas écrire un proc stocké pour le faire à moins que ce ne soit absolument nécessaire.
Un très, très grand merci. Cela marche. –