Sql server 有人能解释一下下面的SQL查询是如何获得“n”最高工资的吗
挑选* 来自雇员A 其中3=选择计数*+1 来自雇员B 其中,B.salary>A.salarySql server 有人能解释一下下面的SQL查询是如何获得“n”最高工资的吗,sql-server,sql-server-2005,Sql Server,Sql Server 2005,挑选* 来自雇员A 其中3=选择计数*+1 来自雇员B 其中,B.salary>A.salary 这是第三高的薪水;有人能解释一下这个查询背后的逻辑以及它是如何工作的吗。换句话说,这个查询将选择另外两个人薪水更高的员工。因此,结果是工资第三高的员工 请注意,如果有两个或两个以上的人的工资完全相同,则此查询可能会失败。换句话说,此查询将选择另外两个工资更高的人的员工。因此,结果是工资第三高的员工 请注意,如果有两个或两个以上的人拥有完全相同的工资,则此查询可能会失败。这只适用于不同的工资: 对于每
这是第三高的薪水;有人能解释一下这个查询背后的逻辑以及它是如何工作的吗。换句话说,这个查询将选择另外两个人薪水更高的员工。因此,结果是工资第三高的员工
请注意,如果有两个或两个以上的人的工资完全相同,则此查询可能会失败。换句话说,此查询将选择另外两个工资更高的人的员工。因此,结果是工资第三高的员工
请注意,如果有两个或两个以上的人拥有完全相同的工资,则此查询可能会失败。这只适用于不同的工资: 对于每个员工,计算工资高于员工工资的行数。如果计数为2+1,则返回员工 因此,它将返回第三个雇员
我会使用“从选择前3名中选择前1名*从员工订单按薪资描述”按薪资排序ASC执行此操作这将仅适用于不同的薪资: 对于每个员工,计算工资高于员工工资的行数。如果计数为2+1,则返回员工 因此,它将返回第三个雇员
我会使用SELECT TOP 1 FROM SELECT TOP 3*FROM Employee ORDER BY Salary DESC a ORDER BY Salary ASC来执行此操作,这就是所谓的相关子查询。可以将其视为在外部查询中的所有记录上循环,并在where子句中对每个记录求值。这是因为where子句中的查询引用了外部查询的别名A 因此,对于中的每一位员工,都会得到高薪员工的数量 通过使用ROW_NUMBER函数,您可能可以在SQL2005和2008中更快地实现此逻辑 例如
这就是所谓的相关子查询。可以将其视为在外部查询中的所有记录上循环,并在where子句中对每个记录求值。这是因为where子句中的查询引用了外部查询的别名A 因此,对于中的每一位员工,都会得到高薪员工的数量 通过使用ROW_NUMBER函数,您可能可以在SQL2005和2008中更快地实现此逻辑 例如
为了举例说明这一点,假设工资如下;重复B的数据 EmpA EmpB 5000 5000 3000 3000 2000年2000年 1500 1500 1000 1000 500 500 在第一个解析中,A.Salary是5000,因此B中超过5000的所有Salary计数都是0。添加一个及其1。现在这将是最高的薪水。
在您的示例中,A.薪水是2000,因此B中超过2000的所有薪水计数将是2,再加上1,它将是3。加入3=3和A。将选择值为2000的薪资。仅用一个示例说明这一点,假设薪资如下;重复B的数据 EmpA EmpB 5000 5000 3000 3000 2000年2000年 1500 1500 1000 1000 500 500 在第一个解析中,A.Salary是5000,因此B中超过5000的所有Salary计数都是0。添加一个及其1。现在这将是最高的薪水。
在您的示例中,A.薪水是2000,因此B中超过2000的所有薪水计数将是2,再加上1,它将是3。加入3=3和A。将选择值为2000的薪资。员工A和员工B是表吗?如果是,它们包含哪些数据?否则,此查询对您试图实现的目标毫无意义。employee是表,A和B是该表的别名。您可以在[here][1]中找到解决方案,因此请遵循给定的链接。[1] :您可以在[此处][1]找到解决方案,因此请按照给定的链接进行操作。[1] :员工A和员工B是表吗?如果是,它们包含哪些数据?否则,此查询对您试图实现的目标毫无意义。employee是表,A和B是该表的别名。您可以在[here][1]中找到解决方案,因此请遵循给定的链接。[1] :您可以在[此处][1]找到解决方案,因此请按照给定的链接进行操作。[1] :+1用于注意如果薪资不唯一,查询可能会给出空结果。+1用于注意如果薪资不唯一,查询可能会给出空结果。
WITH SalaryOrder AS
(
SELECT *
, ROW_NUMBER() OVER(ORDER BY Salary DESC) SalaryRank
FROM employee
)
SELECT *
FROM SalaryOrder
WHERE SalaryRank = 3