我需要从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相同的结果?
谢谢!
答案 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;