2017-02-26 199 views
0

对于下面的查询: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

+0

您正在使用哪个数据库:

在大多数数据库,您可以使用dense_rank()表达这个代替这样的相关子查询的? – GurV

+0

这个查询对我来说看起来是正确的。你有没有真正的问题? –

+0

“WHERE”条款中的条件表示计算> =当前行的薪水数量,并确保此数字为= 2 ...换句话说,取第二高的薪水。 –

回答

1

这是查询:

SELECT Id, Salary 
FROM Employee e 
WHERE 2 = (SELECT COUNT(DISTINCT p.Salary) 
      FROM Employee p 
      WHERE e.Salary <= p.Salary 
     ); 

据计数的不同薪水是大于或等于任何给定雇员的工资的数目。也就是说,查询会计算考虑关系的第二大薪水。

如果你“逆转”了条件,你会做其他事情。

SELECT Id, Salary 
FROM (SELECT e.*, 
      DENSE_RANK() OVER (ORDER BY e.salary) as dr 
     FROM Employee e 
    ) e 
WHERE dr = 2; 
+0

我想我需要再次制定逻辑。假设我们有一个雇员,有4个工资10,20,30,40。现在记录开始逐一处理。因此,我们种得到以下4个中间实现: 选择ID,薪酬 FROM雇员ë WHERE 2 =(SELECT COUNT(DISTINCT p.Salary) FROM雇员p WHERE e.Salary <= 10 ); – Ronald

+0

请检查问题。我修改了这个问题 – Ronald