2015-08-27 99 views
3

我有以下示例:甲骨文:使用选择内选择

Select MAX(1) as foo, count(*) as bar From dual 

这是通过返回1作为foo和1,酒吧正确执行。

现在我将创建一个仅返回foo的内部选择,保留上一个示例中的条。

Select (Select Max(1) as foo From dual), count(*) as bar From dual 

后者例子将提供以下错误:

ORA-00937: not a single-group group function

这可以通过提供一个(冗余?)组通过容易地固定:

Select (Select Max(1) From dual) as foo, count(*) as bar From dual Group By 1 

我的问题是以下:因为我们肯定会在内部select中返回一行(通过提供MAX聚合函数),为什么在声明结束时声明一个组?另外,这个小组是否会对声明的表现产生影响?

回答

1

在第一种情况下

Select MAX(1) as foo, count(*) as bar From dual

你不表达需要一个组,因为你有两个聚合函数,没有其他价值。

在第二种情况下

Select (Select Max(1) From dual) as foo, count(*) as bar From dual Group By 1

突然选择值的一个非集合功能,但某种另一个价值 - 一个子查询的结果,特别设置 - 和Oracle无法知道有多少值是结果集将具有。所以你需要在上面有一个小组。

性能影响不会由组本身引起,而是由子查询引起。在第一个例子中,您只有一次DUAL扫描,而在第二个例子中 - 您将有两个表扫描 - 一个用于子查询,另一个用于主查询。你可以在执行计划中看到。

+0

正如我提到的Stawros,我无法找出原因,Oracle不知道被定义内选择将返回一个值。 – istovatis

+0

这只是不那么聪明:) 对于数据库的子查询被解释为另一个表(或更多的实际上是一个视图),并按照这种方式处理。 – Mihail

+0

结果集就是结果集。根据定义,它可以有多个值。 – Mihail

0

您可以使用计数)over指令( -

Select (Select Max(1) as foo From dual) as foo, count(*) over() as bar 
    From dual 
+0

其实我不想要一个替代解决方案,我只想知道是否有某种原因Oracle不知道内部选择将通过声明返回单个值。 – istovatis