子查询结果 '单行子查询结果多于一行'
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)
【讨论】:
以上是关于子查询结果 '单行子查询结果多于一行'的主要内容,如果未能解决你的问题,请参考以下文章