oracle SQL UPDATE colB中的相同序列号用于colA中的相同值集

hivapdat  于 2023-05-06  发布在  Oracle
关注(0)|答案(2)|浏览(120)

SQL UPDATE colB中的相同序列号用于colA中的相同值集
需要UPDATE SQL语句(首选)或PL/SQL

// Here is script for table create
CREATE TABLE temp 
(   
    "COL_A" VARCHAR2(128 BYTE), 
    "COL_B" NUMBER
);

// script for data load
INSERT INTO temp VALUES ('A', null);
INSERT INTO temp VALUES ('A', null);
INSERT INTO temp VALUES ('B', null);
INSERT INTO temp VALUES ('C', null);
INSERT INTO temp VALUES ('C', null);
INSERT INTO temp VALUES ('C', null);
INSERT INTO temp VALUES ('D', null);
INSERT INTO temp VALUES ('D', null);

之前

-------
TEMP TABLE
-------------
COL_A, COL_B
-------------
A, null
A, null
B, null 
C, null 
D, null
C, null
D, null 
C, null

预期输出

-------------
COL_A, COL_B
-------------
A, 1  
A, 1
B, 2
C, 3
D, 4    
C, 3
D, 4    
C, 3

对于COL_A中的相同值,我们将为N行生成并重用相同的序列号,B列的值来自序列号temp_seq我尝试了几个想法,但我不能为相同的值重用相同的序列号(它正在生成新的序列号)。

ymzxtsji

ymzxtsji1#

您可以:

update temp t
set col_b = (
  select count(distinct col_a)
  from temp u
  where u.col_a <= t.col_a
);

结果:

COL_A  COL_B 
 ------ ----- 
 A      1     
 A      1     
 B      2     
 C      3     
 C      3     
 C      3     
 D      4     
 D      4

请参见db<>fiddle上的运行示例。

1szpjjfi

1szpjjfi2#

merge可能是另一种选择:

SQL> merge into temp a
  2    using (select rowid rid,
  3                  dense_rank() over (order by col_a) col_b
  4           from temp
  5          ) b
  6    on (a.rowid = b.rid)
  7    when matched then update set
  8      a.col_b = b.col_b;

8 rows merged.

SQL> select * from temp;

COL_A           COL_B
---------- ----------
A                   1
A                   1
B                   2
C                   3
C                   3
C                   3
D                   4
D                   4

8 rows selected.

SQL>

相关问题