使用 rowover 分区的 Oracle SQL 更新

Posted

技术标签:

【中文标题】使用 rowover 分区的 Oracle SQL 更新【英文标题】:Oracle SQL Update with rowover partition 【发布时间】:2016-08-23 19:17:19 【问题描述】:

为什么我得到B1.EMPLOYEE_ID is invalid identifier for the SQL below的错误:

UPDATE TABLE_1 A1 
  SET A1.ADDL_SEQ = ( SELECT SEQ 
                        FROM (SELECT ROW_NUMBER() OVER (PARTITION BY EMPLOYEE_ID 
                                                        ORDER BY EMPLOYEE_ID, ERNCD) SEQ
                                FROM TABLE_1) B1 
                       WHERE B1.EMPLOYEE_ID=A1.EMPLOYEE_ID );

【问题讨论】:

您在别名为B1的子查询中没有selectemployee_id 谢谢。现在我收到错误“单行子查询返回多行”。我想要实现的是增加序列号的值 IF EMPOYEE_ID,ERNCD 相同 【参考方案1】:

您也可以这样编写更新语句:

UPDATE 
   (SELECT EMPLOYEE_ID, ADDL_SEQ, 
        ROW_NUMBER() OVER (PARTITION BY EMPLOYEE_ID ORDER BY EMPLOYEE_ID, ERNCD) AS SEQ
   FROM TABLE_1)
SET ADDL_SEQ = SEQ;

【讨论】:

【参考方案2】:

您应该将 EMPLOYEE_ID 添加到您的 B1 内部查询中:

UPDATE TABLE_1 A1 
  SET A1.ADDL_SEQ = ( SELECT SEQ 
                        FROM (SELECT EMPLOYEE_ID,ROW_NUMBER() OVER (PARTITION BY EMPLOYEE_ID 
                                                        ORDER BY EMPLOYEE_ID, ERNCD) SEQ
                                FROM TABLE_1) B1 
                       WHERE B1.EMPLOYEE_ID=A1.EMPLOYEE_ID );

【讨论】:

【参考方案3】:

添加一个case语句,像这样

 UPDATE TABLE_1 A1 
      SET A1.ADDL_SEQ = ( SELECT  
                            (CASE WHEN  employee_id = ERNCD THEN seq ELSE NULL END) AS SEQ
                            FROM (SELECT ROW_NUMBER() OVER (PARTITION BY EMPLOYEE_ID 
                                                            ORDER BY EMPLOYEE_ID, ERNCD) SEQ
                                    FROM TABLE_1) B1 
                           WHERE B1.EMPLOYEE_ID=A1.EMPLOYEE_ID );

我认为您不需要 WHERE 条件,但它很难可视化数据

【讨论】:

以上是关于使用 rowover 分区的 Oracle SQL 更新的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.date , java.sql.timestamp 谓词 -> Oracle 分区数据类型

oracle怎样查询哪些表分区?

在 oracle sql 12c 中可以绕过分区吗?

如何更新oracle表中的分区字段

oracle按时间创建分区表

oracle分区表按时间自动创建