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。同じことについての提案は大歓迎です。

4

2 に答える 2

1

これは(ジャスティンが言ったように)マージではなく、2つの挿入で行う必要があります。一致ごとに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
/

そして、この実行順序を逆にしないでください!!!

于 2012-08-13T00:13:44.863 に答える
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 column>>。上記の SQL ステートメントの代わりにその列名を使用してください。

于 2012-08-12T18:32:38.887 に答える