将rownum从Oracle转换为Postgres

时间:2015-07-29 07:00:07

标签: oracle postgresql limit rownum

我需要从Oracle SQL转换为PostgreSQL。

  select * from table1 inner join table2 on table1.id = table2.table1Id
  where table1.col1 = 'TEST' 
  and rownum <=5
  order by table2.col1

如果我删除and rownum <=5并放在最后limit 5,则两种方言之间存在差异。在Oracle中,首先选择5个元素,然后按table2.col1排序。
在Postgres中,首先对所有列表进行排序,然后选择前5个元素。

如何在Postgres中获得与Oracle相同的结果?

谢谢!

2 个答案:

答案 0 :(得分:1)

要获得所需的行为,可以使用如下子查询:

SELECT * FROM (
    SELECT table1.col1 as t1col1, table2.col1 as t2col1 
    FROM table1 INNER JOIN table2 ON table1.id = table2.table1Id
    WHERE table1.col1 = 'TEST'
    LIMIT 5
) AS sub
ORDER BY t2col1;

我将列命名为,因为在您的示例中,两个表都有一个col1。

但请注意,如果没有对内部查询进行任何排序,您获得的5行选择将是纯随机的,可能会发生变化。

答案 1 :(得分:0)

根据您使用的版本,PostgreSQL 8.4及更高版本具有Window functions。窗口函数 ROW_NUMBER()能够实现Oracle伪列rownum的功能。

select row_number() over() as rownum,* from table1 inner join table2 on table1.id = table2.table1Id where table1.col1 = 'TEST' and rownum <=5 order by table2.col1;