有人可以帮助我理解相关的查询。以下是我想要了解但不能从中获取任何内容的以下查询。请帮助。谢谢。
--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
)
;
答案 0 :(得分:0)
在第一个查询中,您将返回所有e1.Name和e1.Salary,其中员工有2个或更少的记录,其薪水大于e1。
第二个查询执行相同的操作,但仅限于员工未更改部门时。
答案 1 :(得分:0)
查找前3名员工的合法查询可能如下:
SELECT x.*
FROM employee x
HAVING FIND_IN_SET(salary,(SELECT GROUP_CONCAT(DISTINCT salary ORDER BY salary DESC) FROM employee)) <= 3;
注意:如果员工拥有相同的薪水,这可能会返回超过3名员工
答案 2 :(得分:0)
让我们分解它们:
步骤1 - 退还所有薪水前2名工资(3> x)的员工。
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名之一。如果是记录被包括在内。这意味着前2名工资由部门而非公司范围评估,如第1步。
然而,第2步也可以重写,
在除mySQL之外的语言中,可以用以下语言表示: