2011-08-12 3 views
1

je le scénario suivant:Comment filtrer requête imbriquée dans T-SQL

  • Game a GameUID, GameName
  • Player a PlayerUID, PlayerName
  • GamePlayer a GamePlayerUID, 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

L'identificateur en plusieurs parties "G.GameUID" n'a pas pu être lié

erreur

.

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.

Répondre

2
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) 

Oeuf. Je pense que ça le fait? Faites-moi savoir si cela échoue.

+0

Un très, très grand merci. Cela marche. –