SQL子查询返回第N个最高工资以及姓名,城市等

时间:2017-07-11 17:18:52

标签: sql sql-server ssms

发布类似于多次询问的问题的道歉。我找不到另一个会返回其他字段以及薪水字段的线程。我的SQL在下面,我只是用我正在寻找的数字替换3或者。但是,我不知道如何从tblPerson返回Name,Age和City字段。我知道需要某种子查询,但我无法弄明白。任何帮助将非常感激。提前谢谢!

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

3 个答案:

答案 0 :(得分:1)

只需添加您希望子查询返回到select子句的内容,以使您希望将列包含在result表中。但是还要记住在外部查询中包含这些列,以便它们出现在最终结果中。像这样:

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

您子查询中的result表如下所示:

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

它有3行,因为关键字TOP 3tblPerson.salary, tblPerson.name, tblPerson.age,tblPerson.city子句中select的结果。然后我们可以简单地从外表中选择外部查询。

如果您想要每列,或者使用列名指定所需的列,则可以使用select *。您可以在n中更改TOP n,以查看要从顶部选择的行数。

答案 1 :(得分:0)

没有在机器上试试,但让我知道结果/错误:

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

答案 2 :(得分:0)

我使用select top方法看到其他答案。我会更倾向于这一点,但只是个人偏好。

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

行号分配给表中的每一行,按工资排序。然后,您可以使用where选择第n行,在本例中为salary。

获取与第n个工资匹配的所有记录的列表:

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