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

Posted

技术标签:

【中文标题】Oracle 单行子查询在使用嵌套子查询时返回多行【英文标题】:Oracle Single row subquery returns multiple rows while using nested subquery 【发布时间】:2015-07-14 12:33:17 【问题描述】:

我正在尝试运行如下查询,但它会引发“单行子查询返回多行”错误。它可以使用 = 代替 (返回超过 50 行作为最终输出)。当我使用 时无法弄清楚出了什么问题。试过 NOT IN,不起作用。请帮忙。

select a,
       b,
       c,
       d,
       e 
from 
   (select distinct column1 as a,
                    column2 as b,
                    column3 as c,
                    column4 as d,
                    column5 as e
     from t1
     where t1.column1 like 'DOMAIN.%')
where c||d||e <> 'YYY'

【问题讨论】:

我在这里没有看到任何单行子查询。 t1 是不是一个复杂的视图? @mustaccio 没错,我也不是:| @AlexPoole 不,它是一个表,a,b,c,d,e 是根据列上的复杂函数检索的。猜猜这不重要。会不会是数据问题? 异常是来自查询本身还是来自其中一个函数 - 您可以添加错误堆栈,尤其是如果它指示 PL/SQL 错误?有一些与此错误相关的错误(请参阅 MOS 说明 18832.1 以获取列表);没有什么明显相关的,但你隐藏了很多细节。 【参考方案1】:

这只是一种预感,但我认为您在此处的查询中缺少内联视图别名,如下所示

from 
   (select distinct column1 as a,
                    column2 as b,
                    column3 as c,
                    column4 as d,
                    column5 as e
     from t1
     where t1.column1 like 'DOMAIN.%') XXX <-- this one

另外,请尝试使用CONCAT() 函数代替

where concat(concat(c,d),e) <> 'YYY'

【讨论】:

concat() 不像你认为的那样工作——它只接受两个参数as per the documentation。您必须嵌套 concat() 调用才能将 3 个或更多项目连接在一起。恕我直言,使用|| 连接项目的方法更具可读性。 @Boneist,是的,这是真的。编辑答案。实际上这是一种预感,但 concat 运算符也应该可以工作。不过值得一试。 我不是在质疑 concat(如果使用得当)是否会起作用;这是可读性的问题。我发现c||d||econcat(concat(c,d),e) 更容易阅读和理解!最近有人在一个问题中使用了 concat,我必须应用适当的缩进等来弄清楚他们在做什么!当然是 YMMV,但我完全赞成让代码易于阅读和维护! *:-) 大家好,感谢您的意见。我找到了错误的原因 - 这是由于用于获取我认为无害的 column3 的子查询。它获取了超过 1 行并且无法放入“c”中。

以上是关于Oracle 单行子查询在使用嵌套子查询时返回多行的主要内容,如果未能解决你的问题,请参考以下文章

求SQL相关子查询和嵌套子查询通俗的区别 ?

SQL相关子查询和嵌套子查询的区别

SQL语句:子查询

SQL Server 之 子查询与嵌套查询

相关子查询 与 嵌套子查询 有何区别 ?

oracle子查询问题,急急急!