对于下面的查询:MySql的相关子查询执行
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表中查找第二高薪水。
编辑:这个问题似乎在我的理解。我在下面提到我如何感觉查询可能被执行:
假设我们有一个雇员,有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
?
您正在使用哪个数据库:
在大多数数据库,您可以使用
dense_rank()
表达这个代替这样的相关子查询的? – GurV这个查询对我来说看起来是正确的。你有没有真正的问题? –
“WHERE”条款中的条件表示计算> =当前行的薪水数量,并确保此数字为= 2 ...换句话说,取第二高的薪水。 –