发布类似于多次询问的问题的道歉。我找不到另一个会返回其他字段以及薪水字段的线程。我的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
答案 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 3
和tblPerson.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