使用Single语句进行Oracle条件更新

时间:2011-08-12 06:11:42

标签: oracle

我要求更新具有重复条目的Oracle记录(事先不知道),具体取决于我指定的条件,假设我的记录设置如下,

NAME    BRANCH_ID   DEL_FLG  
-----------------------------------
AAA     00931       N  
AAA     00001       N  
BBB     00931       N  
BBB     00008       N  
CCC     00931       N  
CCC     00003       N  
DDD     00931       N  
EEE     00931       N  
FFF     00008       N  

我想要的只是用BRANCH_ID = 00931更新重复记录并设置DEL_FLG ='Y'

输出必须如下,

NAME    BRANCH_ID   DEL_FLG 
----------------------------------- 
AAA     00931       Y   
AAA     00001       N  
BBB     00931       Y  
BBB     00008       N  
CCC     00931       Y  
CCC     00003       N  
DDD     00931       N  
EEE     00931       N  
FFF     00008       N  

这可以用一个SQL完成吗?不使用PL / SQL

2 个答案:

答案 0 :(得分:2)

 update the_table set del_flag = 'Y'
    where branch_id in
    ( select branch_id from the_table group by branch_id having count(*) > 1 )

或者

 update the_table set del_flag = 'Y'
     where branch_id = '00931' and name in
     ( select name from the_table group by name having count(*) > 1 )

(问题并不完全清楚,但正如Alex Poole指出的那样,第二个似乎与你给出的输出相匹配)

答案 1 :(得分:1)

我检查了这个,我认为这就是你想要的。

update the_table set del_flg = 'Y'
    where rowid in
    ( select rowid from 
      (select rowid, count (*) over (partition by name) cnt 
      from the_table)
    where cnt > 1)
    and branch_id = 931;

结果: 前

NAME                 BRANCH_ID            DEL_FLG              
-------------------- -------------------- -------------------- 
AAA                  1                    N                    
BBB                  931                  N                    
BBB                  8                    N                    
CCC                  931                  N                    
CCC                  3                    N                    
DDD                  931                  N                    
EEE                  931                  N                    
FFF                  8                    N                    
AAA                  931                  N                    

 9 rows selected 

NAME                 BRANCH_ID            DEL_FLG              
-------------------- -------------------- -------------------- 
AAA                  1                    N                    
BBB                  931                  Y                    
BBB                  8                    N                    
CCC                  931                  Y                    
CCC                  3                    N                    
DDD                  931                  N                    
EEE                  931                  N                    
FFF                  8                    N                    
AAA                  931                  Y                    

 9 rows selected