Oracle условное обновление с одним оператором - PullRequest
0 голосов
/ 12 августа 2011

У меня есть требование об обновлении записей 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 ]

2 голосов
/ 12 августа 2011
 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 )

(вопрос не совсем ясен, но, как указывает Алекс Пул, второй, похоже, соответствует полученному вами результату)

1 голос
/ 12 августа 2011

Я проверил это, и я думаю, что это то, что вы хотите.

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 

* После 1007 *

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...