对于以下查询:
SELECT Id, Salary
FROM Employee e
WHERE 2 = (SELECT COUNT(DISTINCT Salary) FROM Employee p
WHERE e.Salary<=p.Salary)
不应该e.salary<=p.salary
子查询中的条件被反转。我们应该将 p.salary 列与 e.salary
进行比较重复来自外部查询的列,因此 p.salary
必须位于左侧。如果我的理解有误,请告诉我。
PS:上面的查询试图从 Employee 表中找到第二高的工资。
编辑:这个问题似乎在我的理解范围内。我在下面提到了我对查询可能执行的感觉:
假设我们有一个 Employee 表,有 4 个薪水 10,20,30,40 。现在记录开始被一一处理。所以我们得到了以下 4 个中间实现:
`code`
SELECT Id, Salary
FROM Employee e
WHERE 2 = (SELECT COUNT(DISTINCT p.Salary)
FROM Employee p
WHERE 10<=p.salary -- record with salary 10
);
SELECT Id, Salary
FROM Employee e
WHERE 2 = (SELECT COUNT(DISTINCT p.Salary)
FROM Employee p
WHERE 20<=p.salary
);
SELECT Id, Salary
FROM Employee e
WHERE 2 = (SELECT COUNT(DISTINCT p.Salary)
FROM Employee p
WHERE 30<=p.salary
);
SELECT Id, Salary
FROM Employee e
WHERE 2 = (SELECT COUNT(DISTINCT p.Salary)
FROM Employee p
WHERE 40<=p.salary
);
`code`
这个顺序正确吗?我们尝试比较的列(即 p.salary )不应该位于左侧,例如 p.salary>=e.salary
?
最佳答案
这是查询:
SELECT Id, Salary
FROM Employee e
WHERE 2 = (SELECT COUNT(DISTINCT p.Salary)
FROM Employee p
WHERE e.Salary <= p.Salary
);
它正在计算大于或等于任何给定员工工资的不同工资数量。也就是说,该查询计算第二大薪资时考虑了关系。
如果你“颠倒”条件,你就会做其他的事情。
在大多数数据库中,您可以使用dense_rank()
来表达这一点,而不是这样的相关子查询:
SELECT Id, Salary
FROM (SELECT e.*,
DENSE_RANK() OVER (ORDER BY e.salary) as dr
FROM Employee e
) e
WHERE dr = 2;
关于java - MySql相关子查询的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42468583/