Oracle 如何针对行计数"row_limiting_clause" |百分比行在 Oracle 12c 中有效?



平台:Windows 7 x-64数据库:Oracle Database 12c Enterprise Edition 12.1.0.2.0-64位版本。

行计数|percent行的Oracle row_limiting_clause在Oracle 12c中是如何工作的?

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

案例1当使用row_limiting_clause提取前0.5行时,只有我得到

no rows selected 

案例2当对前5%的行使用row_limiting_clause子句时,我只得到

1 row as output.

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

1 row as output.

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

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:

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

案例2:

SQL> select col1 from fetch_test
  2  fetch first 5 percent rows only;
  COL1                                                                      
  ----                                                                      
     1                                                                      
  1 row selected

案例3:

SQL> select col1 from fetch_test
2  fetch first 1 percent rows only;
COL1                                                                      
----                                                                      
   1  
 1 row selected    

Oracle文档所说的

如果行计数包括一个分数,则该分数部分将被截断。如果行计数为NULL,则返回0行"来源">

这解释了情况1,但我在上面的例子中找不到对情况2和3的可能解释。如有任何帮助,我们将不胜感激。

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

  • rowcount大小写指定截断分数。

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

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

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

使用percent百分比指定要返回的选定行总数的百分比。百分比必须是一个数字或计算结果为数值的表达式。如果指定负数,则百分比将被视为0。如果百分比为NULL,则返回0行。

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

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

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

更新,里沙比指出:

余数(在行限制器中使用PERCENT时(将始终返回一个四舍五入的整数,根据http://community.oracle.com/message/13176927#13176927

最新更新