如何使用同一表中的列进行更新(ORACLE)
Posted
技术标签:
【中文标题】如何使用同一表中的列进行更新(ORACLE)【英文标题】:How to update using column in same table (ORACLE) 【发布时间】:2020-07-02 08:57:26 【问题描述】:我有一个问题要问。
有一个表名“T1”,列有“empno(pk)”、“deptno”、“sort_order”
sort_order 列,有点乱。它运作良好,但看起来很糟糕......所以我想使用 Rank() 更新行。
RANK() OVER(PARTITION BY deptno ORDER BY sort_order ASC) AS new_sorder
我不知道如何使用 NEW_SORDER 的值更新 sort_order 列。 我尝试使用 'MERGE INTO' 效果很好,但我想知道有什么办法不使用 'MERGE INTO'。
这是我尝试过的......
UPDATE t1 A
set A.sort_order = (SELECT B.sort_order FROM
(SELECT empno,
deptno,
RANK() OVER( PARTITION BY deptno
ORDER BY sort_order ASC ) AS new_sorder
FROM t1 B
ORDER BY deptno, sort_order) B
WHERE A.empno = B.empno);
我解决了这个问题,(我不知道我是怎么解决的……wth……) 这就是我使用的。(还有一个列名'dept_order'用于排序结果)
UPDATE t1 a SET sort_order = (
Select new_order
FROM (
select empno,deptno, rank() over (partition by deptno, dept_order
order by sort_order) new_order
FROM t1
) b
WHERE a.empno = b.empno
AND a.deptno = b.deptno );
【问题讨论】:
我会使用merge
,它在与rank()
等函数一起使用时更具可读性。但您的查询也有效:dbfiddle。你能解释一下出了什么问题吗?
Tk 为您的评论思考。不知何故,昨天它不起作用,但现在它起作用了.....
【参考方案1】:
您可以按如下方式对子查询使用更新:
UPDATE T1 A
SET
A.SORT_ORDER = (
SELECT B.NEW_SORDER
FROM (
SELECT EMPNO,
RANK() OVER(
PARTITION BY DEPTNO
ORDER BY SORT_ORDER ASC
) AS NEW_SORDER
FROM T1 B
) B
WHERE A.EMPNO = B.EMPNO
);
【讨论】:
【参考方案2】:您在查询中使用rank()
。但是你可以用一个子查询来模拟它:
update t1
set sort_order = (select 1 + count(distinct tt1.sort_order)
from t1 tt1
where tt1.dept_id = t1.dept_id and tt1.sort_order < t1.sort_order
);
【讨论】:
以上是关于如何使用同一表中的列进行更新(ORACLE)的主要内容,如果未能解决你的问题,请参考以下文章