平台: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