2017-07-11 2 views
0

Toutes nos excuses pour avoir posté une question similaire à celle qui a été posée plusieurs fois. Je ne pouvais pas trouver un autre fil qui retournerait d'autres champs avec le champ de salaire. Mon SQL est ci-dessous, je remplace juste le 3 avec n'importe quel nombre que je regarde ou. Cependant, je ne suis pas sûr comment retourner également les champs de nom, d'âge et de ville de tblPerson. Je sais qu'il doit y avoir une sous-requête, mais je n'ai pas été capable de le comprendre. Toute aide serait très appréciée. Merci d'avance!La sous-requête SQL retournera le salaire le plus élevé avec le nom, la ville, etc.

Select TOP 1 Salary 
FROM 
    (Select DISTINCT TOP 3 Salary 
    FROM tblPerson 
    Order By Salary DESC) Result 
ORDER BY Salary 
+0

Permettez-moi de savoir si mon travail de solution ou jette l'erreur –

Répondre

1

ajouter simplement ce que vous voulez que le sous-requête pour revenir dans la clause select d'avoir les colonnes que vous souhaitez inclure dans le tableau result. Mais n'oubliez pas d'inclure ces colonnes dans la requête externe afin qu'elles apparaissent dans votre résultat final. comme par exemple:

Select TOP 3 result.salary, result.name, result.age, result.city 
FROM 
    (Select DISTINCT TOP 3 tblPerson.salary, tblPerson.name, 
     tblPerson.age,tblPerson.city 
     FROM tblPerson 
     Order By Salary DESC) result 
ORDER BY Salary 

votre table result de votre sous-requête ressemble à ceci:

salary name  age city 
90000 Mr.derp 21 Minneapolis 
80000 Ms.herp 52 St.Paul 
70000 Mr.blah 89 Fakecity 

Il dispose de 3 rangs cause du mot-clé TOP 3 et les colonnes que le résultat de tblPerson.salary, tblPerson.name, tblPerson.age,tblPerson.city dans la clause select. Ensuite, nous pouvons simplement sélectionner à partir de cette table avec la requête externe.

Vous pouvez utiliser select * si vous voulez toutes les colonnes ou spécifier quelle colonne vous voulez avec le nom de la colonne. Vous pouvez changer n en TOP n pour voir combien de lignes vous voulez sélectionner en haut.

+0

PERFECT, merci! – Chuck0185

+0

Cela ne retournera pas les liens, cependant. –

+0

Vous pourriez utiliser rank() pour obtenir les liens –

0

n'a pas essayé sur la machine, mais laissez-moi savoir résultat/erreur de ceci:

Select TOP 1 a.Salary, a.Name, a.Age, a.City 
FROM 
tblPerson a 
inner join 
(Select DISTINCT TOP 3 Salary 
    FROM tblPerson 
    Order By Salary DESC 
)Result 
on a.Salary = Result.Salary 
ORDER BY a.Salary 
0

Je vois d'autres réponses à l'aide de la sélection approche. Je serais plus enclin à cela, mais juste une préférence personnelle.

SELECT * FROM (
    SELECT * 
    ,Row_Number() OVER(ORDER BY Salary DESC) AS rown 
    FROM tblPerson 
) AS x WHERE rown = '3' 

Le numéro de ligne est affecté à chaque ligne de la table, triée par traitement. Vous pouvez ensuite utiliser l'endroit où choisir la nième rangée, dans ce cas le salaire.

Pour obtenir une liste de tous les documents qui correspondent à un salaire nième:

SELECT * FROM tblPerson as p 
INNER JOIN (
    SELECT Salary FROM(
     SELECT Salary 
     ,Row_Number() OVER(ORDER BY Salary DESC) AS rown 
     FROM tblPerson 
    ) AS x1 WHERE rown = '3' 
) AS x2 on x2.salary = p.salary 
+0

C'est un bon appel, je viens de rencontrer un problème cependant. Que se passe-t-il si je veux choisir le 4ème salaire le plus élevé par exemple, mais s'il y a plusieurs personnes qui ont le même salaire, je veux les rendre toutes? – Chuck0185

+0

@ Chuck0185 Ceci pourrait être réalisé en utilisant la méthode Row_Number(), mais nécessiterait une jointure. Je peux éditer dans un exemple, mais la solution par O.KOO peut être plus succincte. –