子查询结果 '单行子查询结果多于一行'

Posted

技术标签:

【中文标题】子查询结果 \'单行子查询结果多于一行\'【英文标题】:Sub-query results 'Single Row Sub-Query results more than One Row'子查询结果 '单行子查询结果多于一行' 【发布时间】:2017-10-24 07:06:55 【问题描述】:

我在 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.

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

输出应该是:

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: 单行子查询返回多于一行

【问题讨论】:

为什么 Muheet 不在结果中?他的薪水比他的老板阿里夫高。 此表中每个员工是否只有 1 个条目,还是可以有多个? 数据是否正确? Arif Muheet 是彼此的老板? 为了避免歧义,我从表格中删除了另一个 arif。 【参考方案1】:
select emp.ename 
from office emp 
where emp.salary>= ( select boss.salary 
                     from office boss 
                     where emp.bname = boss.ename)

【讨论】:

非常感谢!其实我是一个C程序员。我不知道即使在(括号范围内)也可以访问 emp。 @ZahidKhan () 参考仅适用于 1 级删除。这种类型的查询称为相关子查询。 @nacho:当然!【参考方案2】:

您也可以为此使用自联接

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

【讨论】:

【参考方案3】:

自己加入表:

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)

【讨论】:

@XING TOP 在 oracle 中不起作用?呵呵,显然没有。我会暂时改变它。 只要数据库不违反规范化规则,在没有 TOP 额外预防措施的情况下应该可以正常工作。 您提供的答案仍然是其他人已经给出的,因此多次写 sam answer 是没有意义的。您可以随意删除它。 @XING 我提供了多种解决问题的方法,并在我做的时候解释了它在做什么。其他 2 个答案只是代码转储,不鼓励使用。我无法决定你如何投票给你,但我认为这具有超越此的价值。 嗯,我可以看到你的答案的两个版本都已经得到了回答。我想说您可以将您的想法添加为对这些答案的评论并投票,而不是保留您的版本。【参考方案4】:

第三种方法使用存在和相关子查询。

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

【讨论】:

以上是关于子查询结果 '单行子查询结果多于一行'的主要内容,如果未能解决你的问题,请参考以下文章

得到以下错误 ORA-01427: 单行子查询返回多于一行 01427. 00000 - “单行子查询返回多于一行”

单行子查询在 Oracle 中返回多于一行

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

单行子查询返回多于一行

ORA-01427 单行子查询返回多于一行

Oracle SQL:ORA-01427:单行子查询返回多于一行