【问题标题】:How to retrieve random records from Oracle with dbms_random如何使用 dbms_random 从 Oracle 检索随机记录
【发布时间】:2014-08-20 11:08:02
【问题描述】:

我是 sql 的初学者,我想知道您是否可以帮助我弄清楚如何从 Oracle 中检索随机记录。我有以下查询:

SELECT p.* from data p where p.id in 
(SELECT DISTINCT t.id   FROM DATA t, comment c, PTV ptv   
WHERE t.code not in ('x','y','Z') 
and t.id = c.id(+)   and ptv.code = t.code   and ptv.code = t.code   
and ptv.version = t.version  AND t.TASK_CODE != 'DRAFT')

如何从上述查询返回的结果中选择 X 条随机记录?任何建议将不胜感激。

【问题讨论】:

  • Join Func 就可以了。
  • 不相关,但是:停止在 where 子句中使用隐式连接 尤其是 用于外部连接((+) 运算符)。使用显式 JOINLEFT JOIN 运算符。甚至 Oracle 也建议停止使用 (+) 运算符。
  • 附注。 @a_horse_with_no_name 其实使用oracle native(不是ANSI)join语法并没有错,在某种程度上只是个人喜好问题。 ANSI 连接是否提供了更清晰、更容易并允许您编写更便携的语句?是的。我个人确实更喜欢 ANSI 连接语法而不是传统的连接语法。但无论如何,优化器最终会将 ANSI 语法转换为传统语法。
  • @NicholasKrasnov:您是对的,使用已被更新的标准取代的 20 年前的语法并没有什么“错误”。显式JOIN 运算符的一个优点是您不会因为忘记连接条件而意外创建交叉连接。另外,与 LEFT JOIN 运算符相比,(+) 运算符不能做一些事情(正如我所说:Oracle 建议不要再使用 (+)
  • @Nicholas Krasnov 不正确。 Oracle 曾说过,一些较新的优化器结构只能用于新的语法。 (但相反——如果我没记错的话——在某些特殊情况下你只能使用(+))。

标签: sql database oracle random


【解决方案1】:

获取随机数的“简单”方法是使用dbms_random.valuedbms_random.random()rownum

with t as (
      <your query here>
     )
select x.*
from (select t.*
      from t
      order by dbms_random.value
     ) x
where rownum < 10;

我怀疑有更好的方法来编写您的查询。如果您需要这方面的建议,请编写另一个问题,包括示例数据、所需结果,并描述您希望查询执行的操作。

【讨论】:

【解决方案2】:

使用SAMPLE 子句:

select * from data t SAMPLE(1) left outer join comment c on (t.id = c.id)

【讨论】:

    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    相关资源
    最近更新 更多