【发布时间】:2018-06-18 11:37:05
【问题描述】:
使用: Oracle Database 12c 企业版 12.1.0.2.0 版
我正在尝试获取随机行。正如其他 stackoverflow 问题中所建议的那样,我像这样使用DBMS_RANDOM.VALUE -
SELECT column FROM
( SELECT column
FROM table
WHERE COLUMN_VALUE = 'Y' -- value of COLUMN_VALUE
ORDER BY dbms_random.value
)
WHERE rownum <= 1
但是当请求数量增加时,此查询将无法执行。 所以我正在寻找替代方案。
SAMPLE 对我不起作用,因为通过该子句提取的样本没有与我的WHERE 子句匹配的数据集。查询看起来像这样 -
SELECT column FROM table SAMPLE(1) WHERE COLUMN_VALUE = 'Y'
因为SAMPLE 是在我的WHERE 子句之前应用的,所以大多数情况下这不会返回任何数据。
P.S:我可以将部分逻辑移动到应用层(尽管我绝对不是在寻找建议将所有内容加载到内存的答案)
【问题讨论】:
-
select column from (select column, row_number() over (order by column) as rw from table where column_value='Y') tb where rw = dbms_random.value(1,rw)呢?看看它是否更好,我会把它作为答案发布(如果是的话) -
让我试一试。
-
@JorgeCampos 这似乎没有给我一个随机值,rw 总是 1
-
考虑 this approach,它似乎很适合您的“内部 where 子句”要求。
-
是的,我的错。对于子查询返回的第一个注册表,随机函数中的
select column from (select column, row_number() over (order by column) as rw from table where column_value='Y') tb where rw = dbms_random.value(1,(select count(*) from table))rw 将始终评估为 1。这个其他的解决方案可能因为数量不够好,试一试
标签: database oracle database-performance