【问题标题】:Mixing aggregate and non-aggregate values in a subquery, standard or Oracle feature?在子查询、标准或 Oracle 功能中混合聚合值和非聚合值?
【发布时间】:2013-11-05 21:29:44
【问题描述】:

当我在 Oracle 10g 中运行它时,我得到了错误“ORA-01427:单行子查询返回多于一行”,正如我所料:

WITH a as (select  1 somenumber  from dual),
     b as (           select 'foo' foo from dual 
            union all select 'goo'     from dual)
SELECT (select 0.5 from b) 
FROM a 

但是,当我运行以下语句时,我没有收到错误,而是返回“2.5”。

WITH a as (select  1 somenumber  from dual),
     b as (           select 'foo' foo from dual 
            union all select 'goo'     from dual)
SELECT (select sum(a.somenumber)  + 0.5 from b) 
FROM a 

这个标准是否对子查询求和,然后添加 0.5,就好像它是在运行子查询后完成的一样?还是这是一些 Oracle 功能/错误?

编辑:对于那些好奇的人,实际代码看起来更像这样:

WITH a as (select  1 somenumber  from dual),
     b as (           select 'foo' foo from dual 
            union all select 'goo'     from dual)
SELECT (select sum(a.somenumber)  + customfunction(a.somenumber) from b) 
FROM a 

【问题讨论】:

  • 这实际上是 SQL 功能 :) 在任何 SQL 数据库上您都会得到完全相同的结果。
  • 正如 kambajin 所说:一个 feture 否则它就是一个错误。不要依赖这个!
  • @Linger:就像我说的,我希望它会返回一个错误
  • @Kombajn:谢谢!我不知道您可以在执行此操作时添加常量。

标签: sql oracle oracle10g standards


【解决方案1】:

答案是:这是标准的。您的查询是:

SELECT (select sum(a.somenumber)  + 0.5
        from b
       )  as sum_from_b
FROM a 

对于b 中的每一行,将a.somenumber 相加,然后加0.5。您可以将常数添加到计算表达式中。这是标准 SQL。

请注意,您真正在做的是:

SELECT a.somenumber * (select count(*) from b) + 0.5
FROM a;

在这种情况下没有理由有一个相关的子查询。

【讨论】:

  • 从 B 中选择 'constant' - 给出 2 行 - 并且没有错误。你是对的 - 我认为
  • 谢谢!这是我在下午的大部分时间里一直在调试的一份很长的报告的巨大简化。但是有一条逻辑依赖于我上面所说的方式。
猜你喜欢
  • 2021-11-07
  • 2011-08-20
  • 2013-12-06
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多