2014-02-19 87 views
0

我有一個臨時表,重新加載定期。此表中的數據必須轉到目標表(結構完全相同),但是,如果我有重複的值,它必須檢查上次加載的數據並更新目標表。基於列驗證合併表

實施例:

TMP_DP_REGIAO 

SG NOME LOADING_DATE 
AM RG_1102 19-FEB-14 
RO RG_1103 19-FEB-14 
AP RG_1104 19-FEB-14 
TO RG_1105 19-FEB-14 
RO RG_1106 19-FEB-14 

後加載的,該數據應該去TB_DP_REGIAO(即正如我所說,具有相同的結構)。

的一點是:

如果SGTMPTB已經存在,SQL必須驗證如果這個記錄在TMP具有比TB更大LOADING_DATE。如果是這樣,更新TB。否則,忽略它。

有人可以幫助解決這個問題嗎?

在此先感謝!

回答

1

此SQL中,可以適應您的需求:

merge into TB_DP_REGIAO B 
using TMP_DP_REGIAO P 
on (P.SG = B.SG) 
when matched then update set B.NOME = case when B.LOADING_DATE < P.LOADING_DATE then P.NOME else B.NOME end, 
          B.LOADING_DATE = case when B.LOADING_DATE < P.LOADING_DATE then P.LOADING_DATE else B.LOADING_DATE end 
when not matched then insert(SG, NOME, LOADING_DATE) values(P.SG, P.NOME, P.LOADING_DATE) 
; 
+0

謝謝!完美解決了我的問題! :) –

+0

當我第二天運行它,當P.LOADING_DATE提前一天,我得到一個'SQL錯誤:ORA-30926:無法在源表中獲得一組穩定的行。它對我說'刪除任何非確定性條款並重新發布dml.'。你知道發生了什麼嗎?查詢似乎對我來說確實很好。 –

+1

根據這個其他的SO帖子(http://stackoverflow.com/questions/2337271/ora-30926-unable-to-get-a-stable-set-of-rows-in-the-source-tables),這個可能是由於'TMP_DP_REGIAO'在'SG'字段上有重複(我認爲'SG'是關鍵字)。嘗試檢查重複項... – Emmanuel