2012-08-12 95 views
1

我希望在Oracle中執行建設性合併,即如果在源表中找到匹配記錄,則應將具有當前時間戳記的新記錄添加到目標表中。合併,匹配時插入

如何在Oracle中使用合併來實現此目的?下面是我的代碼,它提供了一個「缺少關鍵字」的錯誤。

merge into studLoad sl 
using student s 
on(s.studID=sl.studID) 
when matched 
then 
insert(sl.studID,sl.studName) 
values(s.studID||'abc',s.studName) 
when not matched 
then 
insert(sl.studID,sl.studName) 
values(s.studID,s.studName); 

此外,我不知道如何添加當前時間戳與studName一起。任何建議爲同樣將受到歡迎。

回答

1

這不應該與合併(如賈斯汀說的),但與兩個插入。 對於每場比賽只有一行(也有重複的匹配,就像你在評論中所說的那樣),然後是來自學生的所有行。這可以通過以下方式完成。

insert into studLoad (studID, studName, <<timestamp column>>) 
select studID, studName, systimestamp 
from student 
where studId in (
     selct studId 
     from studLoad 
    ) 
/
insert into studLoad (studID, studName) 
select studID, studName 
from student 
/

並不顛倒這個執行順序!

1

如果要插入新行,無論是否匹配,使用MERGE都沒有意義。只需做一個INSERT

INSERT INTO student(studID, studName, <<timestamp column>>) 
    SELECT (CASE WHEN s.studId IS NOT NULL -- If there is a match 
       THEN <<student ID sequence>>.nextval 
       ELSE sl.studID 
      END), 
     studName, 
     (CASE WHEN s.studId IS NOT NULL -- If there is a match 
       THEN systimestamp 
       ELSE NULL 
      END) 
    FROM studLoad sl 
     LEFT OUTER JOIN student s ON (sl.studID = s.studId) 

請注意,我假設你student表實際上有一個列存儲當前timestamp--在SQL語句代替<<timestamp column>>使用該列名以上。

+0

但我希望檢查整個源表並檢查哪些所有記錄被更新,並將更新記錄的新條目添加到目標表中......那麼,如何使用單個插入來執行此操作?我必須使用合併。 – z22 2012-08-12 18:39:53

+0

@ z22 - 對不起,我不明白。有匹配的情況和沒有匹配的情況有什麼不同?在你發佈的問題中,你在兩種情況下都是在執行「INSERT」。 – 2012-08-12 18:46:28

+0

這就是這樣的情況:如果記錄不存在 - 插入它,如果它存在,保持原樣,並插入一個新的記錄以及時間戳和新的代理鍵 - 希望我這次讓自己清楚。 – z22 2012-08-12 18:49:51