微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL 多行子查询比较

如何解决SQL 多行子查询比较

我想返回部门id-s,其中部门的最低工资高于其他部门的最高工资。 这是我的查询

select *
from hr.employees
where (select min(salary) from hr.employees group by department_id) < any (select max(salary) from hr.employees group by department_id)

我得到的错误是:ORA-01427:单行子查询返回多于一行

即使我使用任何运算符...

有人可以帮忙吗?

解决方法

这是一种方法。首先汇总按部门分组的工资,收集每个部门的最低和最高工资。然后根据问题中的条件自行加入结果(将结果加入自身)。我使用了一个 with 子句,它允许 Oracle 只进行一次聚合。我包括“高薪”部门的最低工资和“低薪”部门的最高工资,只是为了确认查询按预期工作。输出非常大(27 行),但不会大到不适合这个答案。

with d as (
  select department_id,min(salary) as min_sal,max(salary) as max_sal
  from   hr.employees
  group  by department_id
)
select d1.department_id as dept_highsal,d1.min_sal as dept_higsal_min_sal,d2.department_id as dept_lowsal,d2.max_sal as dept_lowsal_max_sal
from   d d1 inner join d d2 on d1.min_sal > d2.max_sal
;

输出:

DEPT_HIGHSAL DEPT_HIGSAL_MIN_SAL DEPT_LOWSAL DEPT_LOWSAL_MAX_SAL
------------ ------------------- ----------- -------------------
          90               17000          80               14000
          90               17000          20               13000
          90               17000         100               12008
          90               17000         110               12008
          90               17000          30               11000
          90               17000          70               10000
          90               17000          60                9000
          90               17000          50                8200
          90               17000                            7000
          90               17000          40                6500
          90               17000          10                4400
          70               10000          60                9000
          70               10000          50                8200
          70               10000                            7000
          70               10000          40                6500
          70               10000          10                4400
         110                8300          50                8200
         110                8300                            7000
         110                8300          40                6500
         110                8300          10                4400
                            7000          40                6500
                            7000          10                4400
         100                6900          40                6500
         100                6900          10                4400
          40                6500          10                4400
          80                6100          10                4400
          20                6000          10                4400
,

试试这个:

select d_id1,d_id2
(select department_id d_id1,min(salary) min_salary
 from hr.employees
group by department_id) q1
join 
(select department_id d_id2,max(salary) max_salary
 from hr.employees
 group by department_id) q2
 on q1.min_salary > q2.max_salary
,

谢谢各位。

这是一个解决方案:

select * from (select main_temp.department_id,min(salary) min_salary,(从 hr.employees temp 中选择 max(salary) where temp.department_id main_temp.department_id) others_max 来自hr.employees main_temp,其中department_id 不是null group by department_id) where min_salary > others_max

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?