java - MySql相关子查询的实现

标签 java sql correlated-subquery

对于以下查询:

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/

相关文章:

java - 使用 Android Studio 单击“构建 APK”时出错

php - 这5张表的SQL查询怎么写?

mysql - 子查询对项目进行计数,然后按主查询的字段对它们进行分组,不重复

sql - Oracle:EXISTS 如何限制行数?

java - FFT后如何得到幅度和对应的频率

java - 调用静态方法时如何指定泛型类型?

java - 您认为哪些静态分析器在 Java 代码上运行很重要,为什么?

mysql - 外键可以引用非唯一索引吗?

sql - SQL Server查询性能-消除了对哈希匹配(内部联接)的需求

sql - 为什么在 where 子句中使用相关查询进行查询时结果集中没有相似的 id