2017-05-29 11 views
1

3つの列H_N、Col58およびTypeで構成されるテーブルParent_tblがあります。これは最初の2つの列が同じ値を持ち、列の種類のみが異なります。oracleの子テーブルの値を考慮して親テーブルを更新する

私はcol58が親との関係を定義するが、child_tblの残りの列はそのテーブルに固有の子テーブルしか持たない。H_Nは両方のテーブルの一意の列である。

S、R、Vのようなすべての値を持つCHILD_TBL I_STATUSが見つかった場合、PARENT_TBLでTYPEをEXCHANGEとして更新する必要があります。それ以外の場合はparent_tblタイプはそのままです。

child_tbl.col58 = 1140のすべての文字がS、R、Vであるため、Parent_tbl.col58 = 1140はそのタイプが 'EXCHANGE'である必要があります。

ここにサンプルのDDLがあります。

CREATE TABLE PARENT_TBL (
    H_N number, 
    col58 number, 
    TYPE varchar(100) 
); 
Insert into PARENT_TBL (H_N,COL58,TYPE) values (2,2,'SALE'); 
Insert into PARENT_TBL (H_N,COL58,TYPE) values (16,16,'SALE'); 
Insert into PARENT_TBL (H_N,COL58,TYPE) values (20,20,'SALE'); 
Insert into PARENT_TBL (H_N,COL58,TYPE) values (34,34,'VOID'); 
Insert into PARENT_TBL (H_N,COL58,TYPE) values (38,38,'SALE'); 
Insert into PARENT_TBL (H_N,COL58,TYPE) values (102,102,'SALE'); 
Insert into PARENT_TBL (H_N,COL58,TYPE) values (111,111,'SALE'); 
Insert into PARENT_TBL (H_N,COL58,TYPE) values (117,117,'SALE'); 
Insert into PARENT_TBL (H_N,COL58,TYPE) values (1140,1140,'RETURN'); 
Insert into PARENT_TBL (H_N,COL58,TYPE) values (131,131,'SALE'); 

commit; 

CREATE TABLE CHILD_TBL 
(
    I_STATUS varchar(100), 
    H_n number, 
    col58 number 
); 


Insert into CHILD_TBL (I_STATUS,H_N,COL58) values ('S',3,2); 
Insert into CHILD_TBL (I_STATUS,H_N,COL58) values ('S',5,2); 
Insert into CHILD_TBL (I_STATUS,H_N,COL58) values ('S',7,2); 
Insert into CHILD_TBL (I_STATUS,H_N,COL58) values ('S',8,2); 
Insert into CHILD_TBL (I_STATUS,H_N,COL58) values ('S',10,2); 
Insert into CHILD_TBL (I_STATUS,H_N,COL58) values ('S',1141,1140); 
Insert into CHILD_TBL (I_STATUS,H_N,COL58) values ('V',1142,1140); 
Insert into CHILD_TBL (I_STATUS,H_N,COL58) values ('R',1143,1140); 
Insert into CHILD_TBL (I_STATUS,H_N,COL58) values ('R',1144,1140); 
Insert into CHILD_TBL (I_STATUS,H_N,COL58) values ('S',1145,1140); 

commit; 

予想される出力:

truncate table PARENT_TBL ; 
    Insert into PARENT_TBL (H_N,COL58,TYPE) values (2,2,'SALE'); 
     Insert into PARENT_TBL (H_N,COL58,TYPE) values (16,16,'SALE'); 
     Insert into PARENT_TBL (H_N,COL58,TYPE) values (20,20,'SALE'); 
     Insert into PARENT_TBL (H_N,COL58,TYPE) values (34,34,'VOID'); 
     Insert into PARENT_TBL (H_N,COL58,TYPE) values (38,38,'SALE'); 
     Insert into PARENT_TBL (H_N,COL58,TYPE) values (102,102,'SALE'); 
     Insert into PARENT_TBL (H_N,COL58,TYPE) values (111,111,'SALE'); 
     Insert into PARENT_TBL (H_N,COL58,TYPE) values (117,117,'SALE'); 
     Insert into PARENT_TBL (H_N,COL58,TYPE) values (1140,1140,**'EXCHANGE'**); 
     Insert into PARENT_TBL (H_N,COL58,TYPE) values (131,131,'SALE'); 
+0

2つのテーブルに与えられたデータの期待される出力も与えます。 – Utsav

+0

Utsav、私は期待される出力を加えました – JDev

答えて

1

経験この

update PARENT_TBL p 
set TYPE='EXCHANGE' 
where exists 
(select 1 
    from child_tbl c 
    where 
    i_status in ('S','R','V') 
    and c.col58=p.col58 
    group by col58 
    having count(distinct(i_status))=3 
) 

を使用しますlanation:

select col58 
from child_tbl c 
where 
    i_status in ('S','R','V') 
    group by col58 
    having count(distinct(i_status))=3 

これは、あなたのフィルターi_status in ('S','R','V')col58どこcount(distinct(i_status))=3を与えるだろう。したがって、少なくとも1つの各ステータスが'S','R','V'である場合にのみ3になります。ここでexists句でこれを使用し、上記のクエリand c.col58=p.col58のどこの条件をに追加して、更新中にparentテーブルと結合します。

この最初のテストデータを試してみて、元のデータをコミットせずに試してみてください。期待した結果が得られたと確信しているときにのみコミットしてください。

0

適切なグループ分けして、子テーブル(CHILD_TBL)内の行を見つけ、mergeを使用します。

merge into parent_tbl p 
using (select col58 
     from child_tbl 
     group by col58 
     having count(decode(i_status, 'S', 1)) > 0 
      and count(decode(i_status, 'R', 1)) > 0 
      and count(decode(i_status, 'V', 1)) > 0) c 
on (p.col58 = c.col58) 
when matched then update set type = 'EXCHANGE' 
関連する問題