无法理解相关查询
问题描述:
有人可以帮助我理解相关查询。以下是我试图理解的查询,但无法从中获得任何信息。请帮助。谢谢。无法理解相关查询
--Step 1
select e1.Name as 'Employee', e1.Salary
from Employee e1
where 3 >
(
select count(distinct e2.Salary)
from Employee e2
where e2.Salary > e1.Salary
)
;
--Step 2
SELECT
d.Name AS 'Department', e1.Name AS 'Employee', e1.Salary
FROM
Employee e1
JOIN
Department d ON e1.DepartmentId = d.Id
WHERE
3 > (SELECT
COUNT(DISTINCT e2.Salary)
FROM
Employee e2
WHERE
e2.Salary > e1.Salary
AND e1.DepartmentId = e2.DepartmentId
)
;
答
在第一个查询你正在返回所有e1.Name和e1.Salary如雇员有2个或更少的记录,他们的工资比E1大。
第二个查询做同样的事情,但只有当员工没有改变部门。
答
一个合法的查询来查找员工与前3名的薪水可能如下:
SELECT x.*
FROM employee x
HAVING FIND_IN_SET(salary,(SELECT GROUP_CONCAT(DISTINCT salary ORDER BY salary DESC) FROM employee)) <= 3;
注:此方法可以返回超过300名员工,如果员工共享同样的薪水
答
让我们打破他们下来:
第1步 - 返回所有在前2名工资(3> x)工资的雇员。
- (SELECT)返回所有员工的名字和他们的工资
- (FROM)的职员表
- (WHERE)排除没有薪水的前2谁员工的子查询只计算工资数量大于当前评估记录。如果这个数字超过2,那么这个人在前3名没有工资。3> 4 = 3> 3将被拒绝,记录被排除。
。
SELECT e1.Name as 'Employee', e1.Salary
FROM Employee e1
WHERE 3 > (SELECT count(distinct e2.Salary)
FROM Employee e2
WHERE e2.Salary > e1.Salary);
另一种方式来写这个查询将
SELECT *
FROM Employee E1
WHERE EXISTS (SELECT *
FROM Employee E2
WHERE E1.Salary = E2.Salary
ORDER By salary Desc
LIMIT 2)
以上基本上说返回顶部2薪水和谁拥有那些薪水的一个员工。
步骤2与步骤1相似;但由于相关性也在部门中,因此结果不同。对于每个员工来说,它确定薪水是否是该部门的前两名之一。如果是包含的记录。这意味着顶部2薪金由部门,而不是公司的评估宽像步骤1
第2步也可以但是重新编写,
在除了MySQL的语言中,这可以表示为:
- 使用窗口/分析函数Dense_rank()和按部门划分;然后将记录限制为排名不超过2的人
- 使用交叉申请和按薪水desc排序的前2名。
- mySQL列出的方法是使用用户变量的最简单的方法。以模拟窗口功能或交叉应用上面。
在第一步,他们希望得到少于3个不同的E1的员工那些有较少的薪水比较E2员工而在2日,他们希望得到同样为第哪来部门一样 – user3712320
好,考虑到第一个查询,你有一个问题,因为第一个查询并没有真正做到(我认为)它试图做的事情 - 我认为哪一个是返回员工薪水最高的三名员工。 – Strawberry
我也不明白。假设你必须改变别人的工作,那么从头开始可能会更好。 –