簡體   English   中英

如何在合並語句中編寫 case 表達式以打印所需的結果

[英]How to write case expression inside merge statement to print the desired result

    CREATE TABLE DELIGATE_DETAILS_MAIN 
       (    E_ID NUMBER(10,0), 
        COMPLETED_DATE TIMESTAMP (6), 
         CONSTRAINT PK_DELIGATE_DETAILS_MAIN PRIMARY KEY (E_ID));

Insert into deligate_details_main (E_ID,COMPLETED_DATE) values (1,to_timestamp('13-12-21 6:05:23.991000000 PM','DD-MM-RR fmHH12:fmMI:SSXFF AM'));
Insert into deligate_details_main (E_ID,COMPLETED_DATE) values (2,to_timestamp('13-12-21 6:05:24.019000000 PM','DD-MM-RR fmHH12:fmMI:SSXFF AM'));
Insert into deligate_details_main (E_ID,COMPLETED_DATE) values (3,to_timestamp('13-12-21 6:05:24.029000000 PM','DD-MM-RR fmHH12:fmMI:SSXFF AM'));
Insert into deligate_details_main (E_ID,COMPLETED_DATE) values (4,to_timestamp('13-12-21 10:46:00.015000000 PM','DD-MM-RR fmHH12:fmMI:SSXFF AM'));

CREATE TABLE CONTROL_MAIN 
   (    E_ID NUMBER(10,0), 
    E_SPEC VARCHAR2(30 BYTE), 
     CONSTRAINT PK_CONTROL_MAIN PRIMARY KEY (E_ID));
     

Insert into CONTROL_MAIN (E_ID,E_SPEC) values (1,'SAP1');
Insert into CONTROL_MAIN (E_ID,E_SPEC) values (2,'FSAP');
Insert into CONTROL_MAIN (E_ID,E_SPEC) values (3,'SAP2');
Insert into CONTROL_MAIN (E_ID,E_SPEC) values (4,'SAP1-480');

CREATE TABLE QUESTION 
   (    E_ID NUMBER(10,0), 
    QUEST VARCHAR2(30 BYTE), 
     CONSTRAINT PK_QUESTION PRIMARY KEY (E_ID));
     

Insert into QUESTION (E_ID,QUEST) values (1,'Yes');
Insert into QUESTION (E_ID,QUEST) values (2,'No');
Insert into QUESTION (E_ID,QUEST) values (3,'Yes');
Insert into QUESTION (E_ID,QUEST) values (4,'Yes');

CREATE TABLE DELIGATE_DETAILS_TRANS 
   (    D_ID NUMBER(10,0), 
    E_ID NUMBER(10,0), 
    COMPLETED_DATE_TRANS DATE, 
    OWNER_DETAIL VARCHAR2(30 BYTE), 
     CONSTRAINT PK_DELIGATE_DETAILS_TRANS PRIMARY KEY (D_ID),
     CONSTRAINT FK_E_ID FOREIGN KEY (E_ID)
      REFERENCES TAM.DELIGATE_DETAILS_MAIN (E_ID));

試圖:

MERGE INTO deligate_details_trans t USING ( SELECT
    ddm.e_id,
    ddm.completed_date
FROM
    deligate_details_main ddm
JOIN control_main cm ON ( cm.e_id = ddm.e_id AND cm.e_spec LIKE %'SAP'% )
    JOIN question      q ON ( q.e_id = ddm.e_id
                         AND q.quest = 'Yes' )
          ) s
    on (t.e_id = s.e_id)
    when not matched then
      insert (d_id,e_id, completed_date_trans, owner_detail)
      values (
    deligate_details_trans_sq.nextval,
    s.e_id,
    CAST(s.completed_date AS DATE),
--Here need to insert owner detail from control main
--If it is SAP1 or SAP2 then it will insert SAP1 or SAP2
--If it is SAP1-480 then it should insert SAP3);

預期 output:

做過 E_ID COMPLETED_DATE_TRANS OWNER_DETAIL
1 1 13-12-21 SAP1
2 3 13-12-21 SAP2
3 4 13-12-21 SAP3

對於 e_id 1:基於 control_main 和問題表的連接條件。 數據應插入到 deligate_details_trans 表中,所有者詳細信息應為 SAP1。

對於 e_id 2:基於 control_main 和問題表的連接條件。 數據不匹配,因此不應將其插入到 trans 表中。

對於 e_id 3:基於 control_main 和問題表的連接條件。 數據應插入到 deligate_details_trans 表中,所有者詳細信息應為 SAP2。

對於 e_id 4,它應該檢查控制主表,如果它是 SAP1-480,那么它應該插入 SAP3,對於其他人,應該從 control_main 表中插入相應的所有者詳細信息

如果要在插入的values子句中使用 case 表達式,則需要在using子句中公開控制表值:

MERGE INTO deligate_details_trans t
USING (
    SELECT
        ddm.e_id,
        ddm.completed_date,
        cm.e_spec
    FROM
        deligate_details_main ddm
    JOIN control_main cm ON ( cm.e_id = ddm.e_id AND cm.e_spec LIKE '%SAP%' )
    JOIN question      q ON ( q.e_id = ddm.e_id
                         AND q.quest = 'Yes' )
) s
ON (t.e_id = s.e_id)
WHEN NOT MATCHED THEN INSERT (
    d_id,e_id, completed_date_trans, owner_detail
)
VALUES (
    deligate_details_trans_sq.nextval,
    s.e_id,
    CAST(s.completed_date AS DATE),
    CASE s.e_spec
        WHEN 'SAP1' THEN 'SAP1'
        WHEN 'SAP2' THEN 'SAP2'
        WHEN 'SAP1-480' THEN 'SAP3'
    END
);

或者將 case 表達式移到using子句中,為其指定別名,然后在values子句中引用該別名:

MERGE INTO deligate_details_trans t
USING (
    SELECT
        ddm.e_id,
        ddm.completed_date,
        CASE cm.e_spec
            WHEN 'SAP1' THEN 'SAP1'
            WHEN 'SAP2' THEN 'SAP2'
            WHEN 'SAP1-480' THEN 'SAP3'
        END AS owner_detail
    FROM
        deligate_details_main ddm
    JOIN control_main cm ON ( cm.e_id = ddm.e_id AND cm.e_spec LIKE '%SAP%' )
    JOIN question      q ON ( q.e_id = ddm.e_id
                         AND q.quest = 'Yes' )
) s
ON (t.e_id = s.e_id)
WHEN NOT MATCHED THEN INSERT (
    d_id,e_id, completed_date_trans, owner_detail
)
VALUES (
    deligate_details_trans_sq.nextval,
    s.e_id,
    CAST(s.completed_date AS DATE),
    s.owner_detail
);

db<>fiddle顯示兩者(將%'SAP'%更改為'%SAP%' ,並添加了序列創建)。


我不確定為什么你在一個表中有一個時間戳,而在另一個表中有一個日期,而且你不需要顯式轉換(盡管它沒有傷害)。 但是,如果您這樣做是因為您只對日期部分感興趣,那么您應該知道 Oracle 日期仍然具有時間組件,即使它沒有以您的 DD-MM-YY 格式或 db< >fiddle 的默認 DD-MON-YY 格式。 如果您想“丟失”時間部分,您可以截斷日期 (DD) 組件的值, 如此 db<>fiddle 所示,它會更改顯示格式,以便您可以看到差異。 但是您可能想保留時間-在這種情況下,請忽略這部分...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM