错误(单行子查询返回多行)
Posted
技术标签:
【中文标题】错误(单行子查询返回多行)【英文标题】:Error (single-row subquery returns more than one row) 【发布时间】:2019-09-09 09:06:45 【问题描述】:这个查询有什么问题?
select en.*,
(select sf.red, sf.blue, sf.green, sf.yellow from data2 sf )
from data1 en;
我有错误
ORA-01427:单行子查询返回多于一行 01427. 00000 - “单行子查询返回多于一行”
【问题讨论】:
这里有什么不明白的地方?错误信息很清楚。 跳过子查询,改为执行 LEFT JOIN。 使用TOP 1: select en.*, (select TOP 1sf.red, sf.blue, sf.green, sf.yellow from data2 sf) from data1 en; @MRsa - 问题被标记为[oracle]
。 TOP 不是 Oracle 中的有效语法
单独运行子查询select sf.red, sf.blue, sf.green, sf.yellow from data2 sf
时看到多少行? data
和 data2
之间的关系是什么——你可能刚刚忘记在子查询中包含相关性;但无论如何,连接几乎肯定更合适,即使您希望有一个 data2
行与每个 data1
行匹配。 (如果是严格的一对一关系,那为什么还要有两张表呢?)
【参考方案1】:
这是您的查询:
select en.*,
(select sf.red, sf.blue, sf.green, sf.yellow from data2 sf )
from data1 en;
像这样使用的select
中的子查询称为标量子查询。这样的子查询可以在可以使用标量值(即单个值,例如数字或字符串)的情况下使用。
标量子查询必须满足两个条件:
它最多返回一行。 它返回一列。您的解决方案很简单,使用LEFT JOIN
:
select en.*, sf.red, sf.blue, sf.green, sf.yellow
from data1 en left join
data2 sf
on 1=1;
或者,在 Oracle 12C 中,您可以使用横向连接:
select en.*, sf.red, sf.blue, sf.green, sf.yellow
from data1 en left join lateral
data2 sf
on 1=1;
在这种情况下,两者看起来相同,但横向连接也可用于相关子查询。
【讨论】:
您能否在另一个示例中扩展lateral
连接实现的功能,其中查询与标准 left join
相比有所不同?以上是关于错误(单行子查询返回多行)的主要内容,如果未能解决你的问题,请参考以下文章