【发布时间】:2013-02-12 12:22:21
【问题描述】:
我从一些表中抽取了一个随机样本,并注意到根据我编写查询的方式,它不起作用。显然,我没有使用 all_tab_columns,我只是提供了一个适用于 vanilla 实例 (9.2.0.8) 的示例。
为什么会这样?
select * from (
select
floor(dbms_random.value(0,1000)) as randomval
from
all_tab_columns where rownum < 10000
) where randomval > 200 and randomval < 300;
但这不会返回任何结果。
select * from (
select
floor(dbms_random.value(0,1000)) as randomval
from
all_tab_columns
) where randomval > 200 and randomval < 300;
查询中
编辑:澄清什么不起作用。
编辑:添加版本 9.2.0.8
【问题讨论】:
-
你能定义“不起作用”吗?第二个查询肯定会返回行。任一查询将返回的行数未知(尽管第一个查询不可能返回超过 10,000 行)。
-
第二个根本不为我返回任何行。我在 sqlplus 中得到“没有选择行”。
-
随机性的本质是随机的。因此,内部查询很可能返回 201 到 299 之间的无值。在 ROWNUM 上添加过滤器实际上可能会使这种结果更有可能而不是更少。所以我认为你不太可能有一个可重现的测试用例。
-
APC - 我使用了一个包含 600 万个结果的表,并尝试了 rownum
-
rownum 将阻止外部谓词推入内联视图(即,它阻止查询被重写为peter 显示的那个)。您还应该看到
where rownum > 0的“好”结果(或no_merge/no_push_pred提示也可能)。在 9i(特别是 9.2.0.2-.8)中存在一个错误,涉及dbms_random的查询合并视图(我认为这是这里发生的事情)
标签: sql oracle random sample rownum