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||e
比concat(concat(c,d),e)
更容易阅读和理解!最近有人在一个问题中使用了 concat,我必须应用适当的缩进等来弄清楚他们在做什么!当然是 YMMV,但我完全赞成让代码易于阅读和维护! *:-)
大家好,感谢您的意见。我找到了错误的原因 - 这是由于用于获取我认为无害的 column3 的子查询。它获取了超过 1 行并且无法放入“c”中。以上是关于Oracle 单行子查询在使用嵌套子查询时返回多行的主要内容,如果未能解决你的问题,请参考以下文章