делать оператор обновления, включающий объединение в oracle sql - PullRequest
0 голосов
/ 16 марта 2020

Я попробовал следующий код, но он не работал

BEGIN
For i in (select BUS_RPT_ID, BUS_RPT_PRIMARY_POC_ID  from BUS_RPT_DTL ) 
LOOP
update BUS_RPT_DTL 
set BUS_RPT_DTL.BUS_RPT_PRIMARY_POC_ID = (select usr_id
from BUS_RPT_DTL b
join FNM_USR u
on LOWER(trim(u.FRST_NAME || ' ' || u.LST_NAME)) =LOWER(trim(b.BUS_RPT_PRIMARY_POC_NME))
where b.BUS_RPT_ID = i.BUS_RPT_ID
and i.BUS_RPT_PRIMARY_POC_ID is not null
);
END LOOP;
END;

У меня в основном есть таблица отчета с идентификатором po c и именем po c, именем po c заполнен, но я хочу вытащить идентификатор po c из таблицы usr и вставить его в идентификатор po c в таблице отчетов. Кто-нибудь может мне помочь?

Ответы [ 3 ]

0 голосов
/ 16 марта 2020
create table BUS_RPT_DTL as
(select 1 bus_rpt_id, 101 bus_rpt_primary_poc_id, 'Joe Dubb' BUS_RPT_PRIMARY_POC_NME from dual union
select 2 bus_rpt_id, 202,  'Bernie Bro' BUS_RPT_PRIMARY_POC_NME from dual union
select 3 bus_rpt_id, null, 'Don Junior' BUS_RPT_PRIMARY_POC_NME from dual
)
;

create table FNM_USR as
( select 909 usr_id, 'Joe' frst_name, 'Dubb' lst_name from dual union
select 808 usr_id, 'Bernie' frst_name, 'Bro' lst_name from dual union
select 707 usr_id, 'Don' frst_name, 'Junior' lst_name from dual
)
;

select * from BUS_RPT_DTL;

update BUS_RPT_DTL b set bus_rpt_primary_poc_id = (select usr_id from fnm_usr u where LOWER(trim(u.FRST_NAME || ' ' || u.LST_NAME)) = LOWER(trim(b.BUS_RPT_PRIMARY_POC_NME)))
where BUS_RPT_PRIMARY_POC_ID is not null
;

select * from BUS_RPT_DTL;
0 голосов
/ 16 марта 2020

Вы также можете использовать оператор Merge, в котором вы можете Update столбец BUS_RPT_PRIMARY_POC_ID для соответствующих случаев для вашего предложения Where, в противном случае это будет Insert новых строк.

MERGE INTO BUS_RPT_DTL bb
USING ( SELECT USR_ID
          FROM BUS_RPT_DTL b
          JOIN FNM_USR u
            ON LOWER(TRIM(u.FRST_NAME || ' ' || u.LST_NAME)) =
               LOWER(TRIM(b.BUS_RPT_PRIMARY_POC_NME)) b
   ON ( bb.BUS_RPT_ID = b.BUS_RPT_ID AND bb.BUS_RPT_PRIMARY_POC_ID IS NOT NULL )
 WHEN MATCHED THEN UPDATE SET bb.BUS_RPT_PRIMARY_POC_ID = b.USR_ID 
 WHEN NOT MATCHED THEN INSERT(bb.BUS_RPT_PRIMARY_POC_NME, bb.BUS_RPT_ID, bb.BUS_RPT_PRIMARY_POC_ID) 
                       VALUES(b.BUS_RPT_PRIMARY_POC_NME , b.BUS_RPT_ID , b.BUS_RPT_PRIMARY_POC_ID );
0 голосов
/ 16 марта 2020

Вам не нужно loop. Было бы достаточно одного update заявления.

update BUS_RPT_DTL b
set b.BUS_RPT_PRIMARY_POC_ID = (select usr_id
from FNM_USR u
on LOWER(trim(u.FRST_NAME || ' ' || u.LST_NAME)) =LOWER(trim(b.BUS_RPT_PRIMARY_POC_NME))
)
Where b.BUS_RPT_PRIMARY_POC_ID is not null

Cheers !!

...