gpt4 book ai didi

sql - Oracle "row_limiting_clause"如何获取rowcount|百分比 PERCENT 行在 Oracle 12c 中有效吗?

转载 作者:搜寻专家 更新时间:2023-10-30 20:38:22 25 4
gpt4 key购买 nike

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

甲骨文如何 row_limiting_clause对于行数|百分比 PERCENT 行在 Oracle 12c 中有效吗?

甲骨文 row_limiting_clause行为怪异。在下面的代码中,表“fetch_test”有 10 行

案例一使用时row_limiting_clause我只获取前 0.5 行,

no rows selected 

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

1 row as output.

案例三当仅对前 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.

案例一:

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

no rows selected

案例二:

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

COL1
----
1

1 row selected

案例三:

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

COL1
----
1

1 row selected

Oracle 文档所说的内容,

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

这解释了案例 1,但我在上面的示例中找不到案例 2 和案例 3 的可能解释。任何帮助将不胜感激。

最佳答案

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

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

  • 没有提到百分比被截断。因此,假设百分比没有被截断是合理的。

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

Use rowcount to specify the number of rows to return. rowcount must be a number or an expression that evaluates to a numeric value. If you specify a negative number, then rowcount is treated as 0. If rowcount is greater than the number of rows available beginning at row offset + 1, then all available rows are returned. If rowcount includes a fraction, then the fractional portion is truncated. If rowcount is NULL, then 0 rows are returned.

Use percent PERCENT to specify the percentage of the total number of selected rows to return. percent must be a number or an expression that evaluates to a numeric value. If you specify a negative number, then percent is treated as 0. If percent is NULL, then 0 rows are returned.

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

更新,rishabi 笔记:

a remainder (when using PERCENT in the row limiter) will ALWAYS return a whole number rounded UP, as per http://community.oracle.com/message/13176927#13176927

关于sql - Oracle "row_limiting_clause"如何获取rowcount|百分比 PERCENT 行在 Oracle 12c 中有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31223349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com