![](/img/trans.png)
[英]Update field in Source table with Identity after insert target with merge statement
[英]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.