首页 > 解决方案 > 如何使用同一表中的列进行更新(ORACLE)

问题描述

我有一个问题要问。

有一个表名“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 );

标签: sqloraclesql-update

解决方案


您可以将更新与子查询一起使用,如下所示:

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
    );

推荐阅读