2016-11-03 4 views
-2

У меня эти две таблицы ниже, мне нужно обновить Table1.Active_flag до Y, где Table2.Reprocess_Flag - N.Обновление в оракуле с соединением двух таблиц

Table1

+--------+--------------+--------------+--------------+-------------+ 
| Source | Subject_area | Source_table | Target_table | Active_flag | 
+--------+--------------+--------------+--------------+-------------+ 
| a  | CUSTOMER  | ADS_SALES | ADS_SALES | N   | 
| b  | CUSTOMER  | ADS_PROD  | ADS_PROD  | N   | 
| CDW | SALES  | CD_SALES  | CD_SALES  | N   | 
| c  | PRODUCT  | PD_PRODUCT | PD_PRODUCT | N   | 
| d  | PRODUCT  | PD_PD1  | PD_PD1  | N   | 
| e  | ad   | IR_PLNK  | IR_PLNK  | N   | 
+--------+--------------+--------------+--------------+-------------+ 

Table2

| Source | Subject_area | Source_table | Target_table | Reprocess_Flag | 
+--------+--------------+--------------+--------------+----------------+ 
| a  | CUSTOMER  | ADS_SALES | ADS_SALES | N    | 
| b  | CUSTOMER  | ADS_PROD  | ADS_PROD  | N    | 
| CDW | SALES  | CD_SALES  | CD_SALES  | N    | 
| c  | PRODUCT  | PD_PRODUCT | PD_PRODUCT | Y    | 
| d  | PRODUCT  | PD_PD1  | PD_PD1  | Y    | 
| e  | ad   | IR_PLNK  | IR_PLNK  | N    | 
+--------+--------------+--------------+--------------+----------------+ 
+0

Ваш вопрос непонятен. – FDavidov

+0

Вы что-то пробовали? Разместите код пожалуйста – Aleksej

+0

UPDATE hdfs_cntrl SET active_flag = 'Y' где источник в (выберите источник из proc_cntrl где Reprocess_Flag = 'N') и subject_area в (выберите subject_area из proc_cntrl где Reprocess_Flag = 'N') и source_table в (выберите target_table из proc_cntrl где Reprocess_Flag = 'N'); –

ответ

1

Использовать все три столбца в одном операторе отбора.

UPDATE hdfs_cntrl SET active_flag = 'Y' 
where (source,subject_area ,source_table) in (select source,subject_area ,source_table from proc_cntrl where Reprocess_Flag = 'N'); 
0
merge into table1 t1 
using table2 t2 
on (t1.sorce=t2.source and t1.Subject_area = t2.Subject_area and t1.Source_table = t2.Source_table and t1.Target_table = t2.Target_table and t2.flag_status = 'N') 
when matched then update set 
t1.flag = 'Y'; 
1

Обновление одной таблицы на основе данных в другой таблице почти всегда лучше делать с утверждением MERGE.

Предполагая source является уникальным ключом в table2:

merge into table1 t1 
    using table2 t2 
    on (t1.source = t2.source) 
when matched 
    then update set t1.active_flag = 'Y' 
    where t2.reprocess_flag = 'N' 
; 

Если вы не знакомы с утверждением MERGE, читать об этом - это так же просто, чтобы узнать, как UPDATE и INSERT и DELETE, он может сделать все три типа операций в одном заявлении, он намного более гибкий и в некоторых случаях более эффективный (быстрее).

0

ОБНОВЛЕНИЕ hdfs_cntrl SET active_flag = 'Y', в котором источник в (выберите источник из proc_cntrl, где Reprocess_Flag = 'N') и subject_area в (выбрать subject_area из proc_cntrl, где Reprocess_Flag = 'N') и source_table в (выбрать target_table из proc_cntrl где Reprocess_Flag = 'N')

Смежные вопросы