如何为rowcount的Oracle“row_limiting_clause” PERCENT行百分比在Oracle 12c中有效吗?

时间:2015-07-04 17:26:16

标签: sql database oracle analytics oracle12c

平台:Windows 7 x-64 数据库:Oracle Database 12c企业版12.1.0.2.0版 - 64位。

Oracle row_limiting_clause如何用于rowcount | %PERCENT行在Oracle 12c中有效吗?

Oracle row_limiting_clause行为奇怪。 在下面的代码中,表“fetch_test”有10行

案例1 使用no rows selected 时只获取前0.5行,

1 row as output.

案例2 当使用row_limiting_clause子句时,前5%的行只有

1 row as output.

案例3 当使用row_limiting_clause子句时,只有前1%的行,我得

SQL> select * from fetch_test;

  COL1 COL2                                                                 
  ---- ----                                                           
     1 A                                                                    
     2 B                                                                    
     3 C                                                                    
     4 D                                                                    
     5 E                                                                    
     6 F                                                                    
     7 G                                                                    
     8 H                                                                    
     9 I                                                                    
    10 J                                                                    

10 rows selected.

这意味着案例1!=案例2 [0.5!= 0.5(10行中的5%)]

SQL> select col1 from fetch_test
  2  fetch first 0.5 rows only;

no rows selected

案例1:

SQL> select col1 from fetch_test
  2  fetch first 5 percent rows only;

  COL1                                                                      
  ----                                                                      
     1                                                                      

  1 row selected

案例2:

SQL> select col1 from fetch_test
2  fetch first 1 percent rows only;

COL1                                                                      
----                                                                      
   1  

 1 row selected    

案例3:

{{1}}

Oracle文档的内容,

如果行计数包含分数,则截断小数部分。如果 行计数为NULL,则返回0行 "source"

这解释了案例1,但我在上面的例子中找不到案例2和3的可能解释。 任何帮助将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

你的观察是正确的。严格阅读Oracle文档表明这种行为是正确的:

  • rowcount case指定分段被截断。

  • 没有提到百分比被截断。因此,可以合理地假设百分比没有被截断。

这似乎是合理的,因为一小部分行没有逻辑意义,但小数百分比确实具有逻辑意义。

  

使用rowcount指定要返回的行数。 rowcount必须是数字或计算结果为数值的表达式。如果指定负数,则rowcount将被视为0.如果rowcount大于从行offset + 1开始的可用行数,则返回所有可用行。如果rowcount包含分数,则截断小数部分。如果rowcount为NULL,则返回0行。

     

使用百分比PERCENT指定要返回的所选行总数的百分比。 percent必须是数字或表达式,其值为数值。如果指定负数,则将百分比视为0.如果百分比为NULL,则返回0行。

http://docs.oracle.com/database/121/SQLRF/statements_10002.htm

对于这组特定的数字,我们可以观察到Oracle将10%的10%转为1。

> select 10*.05, round(10*.05) from dual;
10*.05 round(10*.05) 
------ ------------- 
   0.5             1 

更新,rishabi说明:

  

余数(在行限制器中使用PERCENT时)将始终返回整数舍入为UP http://community.oracle.com/message/13176927#13176927