簡體   English   中英

Oracle SQL 帶條件的合並語句

[英]Oracle SQL Merge Statement with Conditions

我對 SQL 比較陌生,我遇到了目標表未更新的問題。我有重復的帳戶 #(鍵),在相關列中具有不同的聯系信息。我正在嘗試合並聯系信息(源)進入單行/帳號,不重復的聯系信息進入(目標)擴展列。

在此處輸入圖像描述

我構造了一個帶有 case 條件的 Merge 語句來檢查數據是否存在於目標表中。 如果數據不在目標表中,則在擴展列中添加信息。 問題是目標表沒有得到更新。 源表和目標表都是相似性定義的。

**Merge SQL- reduced query**
MERGE INTO target tgt
    USING (select accountno, cell, site, contact, email1 from (select w.accountno, w.cell, w.site, w.contact, email1, row_number() over (PARTITION BY w.accountno order by accountno desc) acct 
    from source w) inn where inn.acct =1) src 
    ON (tgt.accountno = src.accountno)
WHEN MATCHED
    THEN 
        UPDATE SET
                  tgt.phone4 =  
                  CASE WHEN src.cell <> tgt.cell
                  THEN src.cell
                  END,
                  tgt.phone5 =
                  CASE WHEN src.site <> tgt.site
                  THEN src.site
                  END

我已驗證源表中存在應添加到目標表中的 accountno 的聯系信息。 我非常感謝任何關於為什么沒有更新目標表的見解。 我在 Stack 上看到了類似的問題,但沒有回復。

您在 using 子句中的 SRC 子查詢為每個 accountno 僅返回 1 個隨機行。 您需要聚合它們,例如使用 PIVOT:

with source(accountno, cell, site, contact) as ( --test data:
   select 1,8881234567,8881235678,8881236789 from dual union all
   select 1,8881234567,8881235678,8881236789 from dual
)
select accountno, contact, 
       r1_cell, r1_site, 
       r2_cell, r2_site
from (select s.*,row_number()over(partition by accountno order by cell) rn
      from source s
     )
pivot (
   max(cell) cell,max(site) site
    FOR rn
    IN (1 R1,2 R2)
)

所以最后你可以將 r1_cell、r1_site、r2_cell、r2_site 與目標值進行比較並使用所需的值:

MERGE INTO target tgt
    USING (
            select accountno, contact, 
                   r1_cell, r1_site, 
                   r2_cell, r2_site
            from (select s.*,row_number()over(partition by accountno order by cell) rn
                  from source s
                 )
            pivot (
               max(cell) cell,max(site) site
                FOR rn
                IN (1 R1,2 R2)
            )
          ) src 
    ON (tgt.accountno = src.accountno)
WHEN MATCHED
    THEN 
        UPDATE SET
                  tgt.phone4 =  
                  CASE 
                       WHEN src.r1_cell <> tgt.cell 
                          THEN src.r1_cell
                          ELSE src.r2_cell
                  END,
                  tgt.phone5 =
                  CASE WHEN src.r1_site <> tgt.site 
                     THEN src.r1_site
                     ELSE src.r2_site
                  END
/

問題在於您在 row_numbering 具有相同 account_number 的行中使用的邏輯。

MERGE 
 INTO target tgt
USING (select accountno, cell, site, contact, email1 
         from (select w.accountno, w.cell, w.site, w.contact, email1
                    , row_number() over (PARTITION BY w.accountno order by w.accountno desc) acct 
                from source w
              left join target w2
                  on w.accountno=w2.accountno
               where w2.cell is null /* get records which are not in target*/ 
              ) inn 
         where inn.acct =1
       ) src 
   ON (tgt.accountno = src.accountno)
WHEN MATCHED THEN 
     UPDATE 
        SET tgt.phone4 = src.cell,
            tgt.phone5 = src.site

暫無
暫無

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

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