用行号更新 Oracle table 列
Update Oracle table column with row number
我想用行号更新 table 列。
empid
列中的每一行都应更新为相关的行号。
我尝试了以下查询。
UPDATE employee SET empid = row_number();
但这不起作用。有什么想法吗?
首先,这不是 row_number()
函数的正确语法,因为您缺少 over
子句(导致 ORA-30484 错误)。即使是,这也行不通,因为您不能在 set
子句中直接使用 window 函数(导致 ORA-30483 错误)。
然而,对于这个用例,您可以只使用 rownum
伪列:
UPDATE employee SET empid = ROWNUM;
您可以执行如下操作。如果需要,您可以更改 ORDER BY 对行的排序。
UPDATE emp
SET empid = emp.RowNum
FROM (SELECT empid, ROW_NUMBER() OVER (ORDER BY empid) AS rowNum FROM employee) emp
UPDATE employee SET empid = row_number();
首先,它在语法上是不正确的。
其次,如果没有 analytic_clause,则无法使用 ROW_NUMBER()
分析函数。
当你回复我的评论说顺序对你来说无关紧要时,你可以简单地使用 ROWNUM.
UPDATE employee SET empid = ROWNUM;
它将通过随机选择行来分配伪列值。由于您分配的是 EMPID,我建议您考虑订购。
通常员工 ID 是使用 SEQUENCE 对象生成的。自增功能有两种实现方式:
- Oracle 11g 及以下 - Auto-increment using trigger-sequence approach
- Oracle 12c - IDENTITY column autoincrement functionality
你也可以这样做
create table your_table_name as
select row_number() over( order by 1) as serial_no, a.* from your_query a
这会在您编写 table 本身时创建序列号。 (请注意,如果您希望它充当 pk,则不要将其设置为 PK)
我想用行号更新 table 列。
empid
列中的每一行都应更新为相关的行号。
我尝试了以下查询。
UPDATE employee SET empid = row_number();
但这不起作用。有什么想法吗?
首先,这不是 row_number()
函数的正确语法,因为您缺少 over
子句(导致 ORA-30484 错误)。即使是,这也行不通,因为您不能在 set
子句中直接使用 window 函数(导致 ORA-30483 错误)。
然而,对于这个用例,您可以只使用 rownum
伪列:
UPDATE employee SET empid = ROWNUM;
您可以执行如下操作。如果需要,您可以更改 ORDER BY 对行的排序。
UPDATE emp
SET empid = emp.RowNum
FROM (SELECT empid, ROW_NUMBER() OVER (ORDER BY empid) AS rowNum FROM employee) emp
UPDATE employee SET empid = row_number();
首先,它在语法上是不正确的。
其次,如果没有 analytic_clause,则无法使用 ROW_NUMBER()
分析函数。
当你回复我的评论说顺序对你来说无关紧要时,你可以简单地使用 ROWNUM.
UPDATE employee SET empid = ROWNUM;
它将通过随机选择行来分配伪列值。由于您分配的是 EMPID,我建议您考虑订购。
通常员工 ID 是使用 SEQUENCE 对象生成的。自增功能有两种实现方式:
- Oracle 11g 及以下 - Auto-increment using trigger-sequence approach
- Oracle 12c - IDENTITY column autoincrement functionality
你也可以这样做
create table your_table_name as
select row_number() over( order by 1) as serial_no, a.* from your_query a
这会在您编写 table 本身时创建序列号。 (请注意,如果您希望它充当 pk,则不要将其设置为 PK)