首页 > 解决方案 > 将 postgres sql 查询转换为 oracle

问题描述

我正在尝试加快 Oracle 中的随机选择查询并找到此博客。我无法在 oracle 中转换他们的以下 Postgres 查询:

    select * from users
      where 
        random() < 200 / (select count(1) from logs)::float
      order by random()
      limit 100;

   select * from users
     where id in (
       select round(random() * 21e6)::integer as id
       from generate_series(1, 110)
       group by id -- Discard duplicates
       )
     limit 100;

这个查询在 oracle 中会是什么样子?

标签: sqloraclepostgresql

解决方案


您可以使用这样的查询:

 select * from 
 (
 select u.*, row_number() over (order by dbms_random.value) as rn 
   from users u
  where 
    dbms_random.value < 200 / (select count(1) from logs)
  )
  where rn <= 100;

select * from
(
select u.*, row_number() over (order by 1) as rn
  from users u
 where id in (
              select round(dbms_random.value * 21e6) as id                    
                from dual
             connect by level <= 110  
             )
 )
 where rn <= 100;

如果您的 Oracle DB 版本是 12c,您可以在子查询中使用和删除(由function 组成)列 替换where rn <= 100部分。fetch first 100 rows onlyrnrow_number()


推荐阅读