簡體   English   中英

如何使用Merge語句更新目標表

[英]How to update a target table with Merge statement

我試圖通過將目標表與源表聯接並使用以下錯誤,使用merge語句更新目標表中的列。

我需要將TRADE表中的offer_id,order_Date和Doc_receipt_date與offer_trade_by_date,offer_start_date,offer_end_date進行比較。 在這里,我試圖驗證交易是否在該時間段內完成。 如果交易及時完成,則通過檢查(即“ Y”)。 如果未及時進行貿易,則它未通過檢查(即“ N”)。 如果我們沒有任何信息可以檢查條件(即,當DOCK_RECEIPT_DATE為NULL時),然后('X')。 為了實現此檢查,我編寫了以下代碼並得到以下錯誤。

ORA:30926無法在源表中獲得穩定的行集。

檢查下表中的數據。

貿易/目標表

KEYID      DPBL_OFFER      ORD_DATE    DOC_RECPT_DT     TRADE_DATE_MET

 1          107           30-SEP-17     01-JAN-17              X
 2          107           22-SEP-17      NULL                  X
 3          107           07-OCT-17      NULL                  X
 4          107           24-NOV-17     28-NOV-17              X
 5          106           24-AUG-17     11-SEP-17              X
 6          105           11-JUN-17       NULL                 X
 7          108           05-SEP-17     13-SEP-17              X
 8          109           28-JUL-17     10-AUG-17              X
 9          110           01-SEP-17     14-SEP-17              X

PROD_OFFER /來源表)

Offer_id                Trade_by_Date
 106                      14-OCT-17
 107                      14-NOV-17
 105                      02-AUG-17
 108                      18-NOV-17
 109                      14-OCT-17
 110                      18-NOV-17

OFFER_START_END_V /來源表2)

Offer_id      Offer_Period   Offer_Start_Date    Offer_End_Date
  106             1             27-JUL-17          27-JUL-17
  106             2             28-JUL-17          14-OCT-17
  107             1             15-SEP-17          23-JAN-18
  105             1             01-JUN-17          02-AUG-17
  108             1             23-AUG-17          14-SEP-17
  108             2             16-SEP-17          19-SEP-17
  110             1             23-AUG-17          14-SEP-17
  110             2             16-SEP-17          19-SEP-17 
  109             1             02-JUL-17          12-NOV-17

我的目標表中的keyid是PK,DPBL_OFFER id是目標表中的offer_id,不是FK。

檢查下面的代碼

MERGE INTO TRADE TB
   USING (
            SELECT T1.KEYID, T1.DPBL_OFFER
              , CASE WHEN T1.ORD_DATE >= T3.OFFER_START_DATE AND
                          T1.ORD_DATE <= T2.TRADE_BY_DATE AND
                          T1.COD_RECPT_DATE <= T3.OFFER_END_DATE
                     THEN 'Y'
               WHEN T1.ORD_DATE < T3.OFFER_START_DATE AND
                          T1.ORD_DATE > T2.TRADE_BY_DATE AND
                          T1.COD_RECPT_DATE > T3.OFFER_END_DATE
                THEN 'N'
            ELSE 'X'
           END AS TRADE_DATE_MET
         FROM TRADE T1
         JOIN PROD_OFFER  T2
               ON T1.DPBL_OFFER_ID = T2.OFFER_ID
          JOIN OFFER_START_END_V T3
                ON T1.DPBL_OFFER_ID = T3.OFFER_ID) JT

        ON TB.KEYID  = JT.KEYID
          AND TB.DPBL_OFFER_ID = JT.OFFER_ID
WHEN MATCH THEN
         UPDATE SET TB. TRADE_DATE_MET = JT.TRADE_DATE_MET;

有人可以幫助我克服這一錯誤嗎?

僅供參考:-我正在使用Oracle 11g。

該錯誤通常表示目標表中至少有一行(至少一行,可能有很多行),而在源表中至少有兩行不同(在您的情況下為三表聯接的結果) )滿足MERGE語句中的ON條件,並且UPDATE子句中使用的值實際上不同。

在您的情況下:對於KEYID = 5,DPBL_OFFER為106。這將連接到PROD_OFFER中的一行和OFFER_START_END_V中的行。 對於三表聯接中的兩個結果行,TRADE_END_MET是不同的。 (或者,如果相同,對於這兩個KEYID,如果都說'N',則對於KEYID = 7,DPBL_OFFER = 108,它也連接到最后一個表中的兩個不同行,則得出的TRADE_END_MET不是兩排相同。)

這種錯誤通常是致命的,因為實際上是邏輯錯誤,與代碼(甚至語言)無關。 也就是說,即使您用通用語言表達問題,並嘗試用紙和鉛筆解決問題,也不會,因為這是自相矛盾的。

它類似於但比其復雜:目標表具有列ID(主鍵)和FLAG(當前為null)。 源具有列ID和標志。 目標有一行(1,空)。 源有兩行,(1,'Y')和(1,'N')。 您要使用源更新目標中的標志。 您知道為什么這沒有意義嗎? 這正是您遇到的問題。

單獨運行三向聯接(MERGE的“源表”),並檢查TRADE_END_MET的KEYID = 5和7值-您可能會發現問題。

暫無
暫無

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

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