【问题标题】:Oracle SQL Update with rowover partition使用 rowover 分区的 Oracle SQL 更新
【发布时间】: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 相同

标签: sql oracle window-functions


【解决方案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 条件,但它很难可视化数据

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-01
        • 1970-01-01
        • 2018-10-05
        • 1970-01-01
        • 2014-11-01
        • 2013-07-31
        • 1970-01-01
        相关资源
        最近更新 更多