使用 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
的子查询中没有select
employee_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 更新的主要内容,如果未能解决你的问题,请参考以下文章