【问题标题】:Update column with values from another column using a cursor使用游标使用另一列中的值更新列
【发布时间】:2014-05-27 18:08:37
【问题描述】:

我有一个表 table 有 2 列 column1column2。我正在执行以下查询以获取所有重复的行并枚举每组重复行中的行:

CURSOR c
    IS
      SELECT groupnum,
             column1,
             column2,
             seqnum
        FROM (SELECT t.*,
                     COUNT (*) OVER (PARTITION BY column1, column2)
                         AS cnt,
                     DENSE_RANK () OVER (ORDER BY column1, column2)
                         AS groupnum,
                     ROW_NUMBER ()
                     OVER (PARTITION BY column1, column2
                           ORDER BY column1)
                         AS seqnum
                FROM table) t
       WHERE cnt > 1
    ORDER BY groupnum;

对于具有这些值的表 table

+------------+---------+
| COLUMN1    | COLUMN2 |
+------------+---------+
| a          | x       |
| a          | x       |
| o          | o       |
| o          | o       |
+------------+---------+

光标将检索此数据:

+----------+------------+------------+--------+
| GROUPNUM | COLUMN1    | COLUMN2    | SEQNUM |
+----------+------------+------------+--------+
| 1        | a          | x          | 1      |
| 1        | a          | x          | 2      |
| 2        | o          | o          | 1      |
| 2        | o          | o          | 2      |
+----------+------------+------------+--------+

我的目标是从SEQNUM 列中选择每个值,并更新表tablecolumn1 列中的对应字段:

+------------+---------+
| COLUMN1    | COLUMN2 |
+------------+---------+
| a1         | x       |
| a2         | x       |
| o1         | o       |
| o2         | o       |
+------------+---------+

我尝试了一个游标 FOR 循环,但我无法弄清楚如何在 column1 中的每个字段和每个 SEQNUM 之间建立对应关系。

【问题讨论】:

    标签: sql database oracle plsql


    【解决方案1】:

    您需要找到一种方法来识别每条记录。最简单的方法是使用rowid(我们是在oracle,对吧?):

     select rowid, 
     DENSE_RANK () OVER (ORDER BY column1, column2) groupnum
     column1, column2, ROW_NUMBER () OVER 
     (PARTITION BY column1, column2 ORDER BY rowid) seqnum
     from table1
     where (column1, column2) in 
     (select column1, column2 
     from table1 
     group by column1, column2 
     having count(*) > 1)
    

    我修改了您的查询(我的 groupnum 与您的不同,因为我没有计算唯一组),我的 seqnum 是稳定的,不会在运行之间改变。

    因此,要进行更新,我将通过 rowid 将上述查询加入 table1。

    【讨论】:

    • 你在groupnum 之后失去了昏迷,对吧? seqnum 现在稳定了吗,因为您是通过 rowid 订购的?
    • 两个问题都是:)
    猜你喜欢
    • 2010-11-22
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    相关资源
    最近更新 更多