一个更好的查询来查找在其部门中拥有最高薪水的员工列表?

Ash*_*pta 3 sql sql-server logic

我有一张桌子: [tblEmp]

EmpId | EmpName | DeptId
Run Code Online (Sandbox Code Playgroud)

和一张桌子 [tblSalary]

EmpId | Salary
Run Code Online (Sandbox Code Playgroud)

我需要找到在他们部门有最高薪水的员工名单.

我可以通过以下方式实现:

SELECT *
FROM tblEmp
JOIN tblSal ON tblSal.EmpId = tblEmp.EmpId
WHERE LTRIM(STR(deptid)) + LTRIM(STR(salary)) IN (
    SELECT LTRIM(STR(deptid)) + LTRIM(STR(MAX(salary)))
    FROM tblSal
    JOIN tblEmp ON tblSal.EmpId = tblEmp.EmpId
    GROUP BY DeptId
)
Run Code Online (Sandbox Code Playgroud)

有更好的方法来实现这个清单吗?

Adr*_*der 5

您可以尝试使用ROW_NUMBER.

返回结果集分区中行的序号,从1开始,每个分区的第一行.

就像是

;WITH Employees AS (
        SELECT  e.*,
                ROW_NUMBER() OVER(PARTITION BY e.DeptId ORDER BY s.salary DESC) RowID
        FROM    [tblEmp] e INNER JOIN
                [tblSalary] s ON    e.EmpId = s.EmpId
)
SELECT  *
FROM    Employees
WHERE   RowID = 1
Run Code Online (Sandbox Code Playgroud)

但是,这不会返回在同一部门中具有相同salry的员工.

为此,您可能需要查看RANK(Transact-SQL)DENSE_RANK(Transact-SQL)而不是ROW_NUMBER.

Rank:返回结果集分区中每行的排名.行的等级是一行加上有关行之前的等级数.

如果两个或更多行绑定排名,则每个绑定的行接收相同的排名.

Dense_Rank:返回结果集分区内的行级别,排名中没有任何间隙.行的等级是一行加上有关行之前的不同等级的数量.