子查询结果'单行子查询结果超过一行'

时间:2017-10-24 07:06:55

标签: sql oracle subquery

我在Oracle 11g上的SQL终端中创建了一个表Office

<小时/> 谁的3列是谁 Ename | Bname | salary其中: -
Ename:雇主的姓名 Bname:老板名字
Salary:员工工资。

Office Table内的值为: -

ENAME                BNAME                    SALARY
-------------------- -------------------- ----------
Zahid                Muheet                    30000
Arif                 Muheet                    20002
Ahtishaam            Muheet                    20002
Ayaaz                Muheet                     2000
Zaid                 Muheet                    40000
Muheet               Akib                      40000

6 rows selected.

我想检索ename大于或等于salary boss的所有员工姓名(salary)。

输出应该是:

ENAME
------
Zaid

我正在我的终端上写一个查询

select emp.ename
from office emp
where emp.salary >= (select a.salary
                     from office a,
                          office b
                     where a.ename = b.bname)

我想它应该可以工作,但是会导致错误:

  

ORA-01427:单行子查询返回多行

4 个答案:

答案 0 :(得分:2)

select emp.ename 
from office emp 
where emp.salary>= ( select boss.salary 
                     from office boss 
                     where emp.bname = boss.ename)

答案 1 :(得分:1)

您也可以使用自联接

select o1.ename 
from office o1
join office o2 on o1.ename = o2.bname
where o1.salary >= o2.salary

答案 2 :(得分:0)

自己加入桌子:

SELECT
oa.ename
FROM office AS oa
INNER JOIN office AS ob ON oa.bname = ob.ename
WHERE oa.salary >= ob.salary;

这会创建一个结果集,其中每个人的工资和姓名以及他们的老板工资和姓名都可用,然后按员工工资大于或等于老板工资的那些过滤它。

在像这样的情况下,不需要使用子查询,但如果你必须这样做,也可以使用子查询:

SELECT
oa.ename
FROM office AS oa
WHERE oa.salary >= (SELECT ob.salary FROM office AS ob WHERE ob.ename = oa.bname)

答案 3 :(得分:0)

使用exists和相关子查询的第三种方法。

SELECT Emps.EName
FROM Office Emps
WHERE EXISTS (SELECT * 
              FROM Office Boss 
              WHERE Emps.BName = Boss.EName 
                and Emps.Salary >= Boss.Salary)