错误(单行子查询返回多行)

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 时看到多少行? datadata2 之间的关系是什么——你可能刚刚忘记在子查询中包含相关性;但无论如何,连接几乎肯定更合适,即使您希望有一个 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 相比有所不同?

以上是关于错误(单行子查询返回多行)的主要内容,如果未能解决你的问题,请参考以下文章

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

Oracle 单行子查询在使用嵌套子查询时返回多行

ORA-01427 单行子查询返回多行 - 如何解决?

Oracle Left Join 导致单行子查询返回多行错误

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

更新语句中的“单行子查询返回多行”