将特定于Oracle的sql迁移到postgresql
甲骨文: 博士后: 问题:postgresql中没有Rownum,如果我们使用将特定于Oracle的sql迁移到postgresql,sql,postgresql,window-functions,Sql,Postgresql,Window Functions,甲骨文: 博士后: 问题:postgresql中没有Rownum,如果我们使用row\u number()over()而不是Rownum,将引发PSQLException select RANK () OVER (PARTITION BY EQUIP_UNIT_INIT_CODE ORDER BY EQUIP_UNIT_INIT_CODE, ROWNUM) from CAR_SEARCH_GTT; 问题:如何将上述查询转换为PostgreSQL?如果您不希望在打领带时重复编号,则使用非确定性
row\u number()over()
而不是Rownum
,将引发PSQLException
select RANK () OVER (PARTITION BY EQUIP_UNIT_INIT_CODE ORDER BY EQUIP_UNIT_INIT_CODE, ROWNUM) from CAR_SEARCH_GTT;
问题:如何将上述查询转换为PostgreSQL?如果您不希望在打领带时重复编号,则使用非确定性的
ROWNUM
是有意义的
也就是说,正如没有名字的@a_horse_所说的那样,ORDER BY
与PARTITION BY
相同的列毫无意义
请试试这个:
ERROR: window functions are not allowed in window definitions
如果CAR\u SEARCH\GTT
上有一个PK作为id
,那么您可以执行以下操作:
with numbered as (
select *, row_number() over () as rnum
from CAR_SEARCH_GTT
)
select RANK () OVER (PARTITION BY EQUIP_UNIT_INIT_CODE
ORDER BY EQUIP_UNIT_INIT_CODE, rnum)
from CAR_SEARCH_GTT;
如果您不希望在平局中重复编号,则使用非确定性的
ROWNUM
是有意义的
也就是说,正如没有名字的@a_horse_所说的那样,ORDER BY
与PARTITION BY
相同的列毫无意义
请试试这个:
ERROR: window functions are not allowed in window definitions
如果CAR\u SEARCH\GTT
上有一个PK作为id
,那么您可以执行以下操作:
with numbered as (
select *, row_number() over () as rnum
from CAR_SEARCH_GTT
)
select RANK () OVER (PARTITION BY EQUIP_UNIT_INIT_CODE
ORDER BY EQUIP_UNIT_INIT_CODE, rnum)
from CAR_SEARCH_GTT;
SQL表表示无序集。如果没有显式排序,行的顺序是任意的。如果排序键不是唯一的,则关系的顺序是任意的
然后,对于窗口函数,您不需要重复ORDER BY
中的PARTITION BY
键。您可以在Oracle中编写所需内容:
select RANK () OVER (PARTITION BY EQUIP_UNIT_INIT_CODE
ORDER BY EQUIP_UNIT_INIT_CODE, id)
from CAR_SEARCH_GTT;
尽管有rownum
,但排序是任意的。Oracle不保证每个组内的订单
rownum
的一个效果是在每一行上有一个不同的值。因此,没有联系。使用行号()可以更清楚地表达这一点。
:
Oracle需要一个ORDER BY子句,所以任何东西都可以到达那里
在Postgres中,您可以通过删除ORDER by
来执行相同的操作——Postgres扩展了行数的语法。因此,等价物是:
select ROW_NUMBER() OVER (PARTITION BY EQUIP_UNIT_INIT_CODE ORDER BY ROWNUM)
from CAR_SEARCH_GTT;
在这两种情况下,您可能都有一个适当的键用于排序——可能是标识列或创建日期。SQL表表示无序集。如果没有显式排序,行的顺序是任意的。如果排序键不是唯一的,则关系的顺序是任意的
然后,对于窗口函数,您不需要重复ORDER BY
中的PARTITION BY
键。您可以在Oracle中编写所需内容:
select RANK () OVER (PARTITION BY EQUIP_UNIT_INIT_CODE
ORDER BY EQUIP_UNIT_INIT_CODE, id)
from CAR_SEARCH_GTT;
尽管有rownum
,但排序是任意的。Oracle不保证每个组内的订单
rownum
的一个效果是在每一行上有一个不同的值。因此,没有联系。使用行号()可以更清楚地表达这一点。
:
Oracle需要一个
ORDER BY子句,所以任何东西都可以到达那里
在Postgres中,您可以通过删除ORDER by
来执行相同的操作——Postgres扩展了行数的语法。因此,等价物是:
select ROW_NUMBER() OVER (PARTITION BY EQUIP_UNIT_INIT_CODE ORDER BY ROWNUM)
from CAR_SEARCH_GTT;
在这两种情况下,您可能都有一个适当的键用于排序--可能是标识列或创建日期。总体选择上的order by
是什么?我问这个问题的原因是因为Oracle根据订单生成rownum
@a\u horse\u,名称为\u no\u谢谢您的回复,我已经更新了查询。很抱歉,这是我的错。@MikeOrganek是的,但Postgresql不支持按分区和按顺序排列。我删除了我的答案,因为我同意没有名字的@a_horse_。这个查询没有多大意义。您的分区似乎是以一种不确定的方式完成的。并且在移植时很可能会有不同的行为。在整个select
上的order by
是什么?我问这个问题的原因是因为Oracle根据订单生成rownum
@a\u horse\u,名称为\u no\u谢谢您的回复,我已经更新了查询。很抱歉,这是我的错。@MikeOrganek是的,但Postgresql不支持按分区和按顺序排列。我删除了我的答案,因为我同意没有名字的@a_horse_。这个查询没有多大意义。您的分区似乎是以一种不确定的方式完成的。并且在移植时很可能会有不同的行为。