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

如果您要插入新行,无论是否匹配,使用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 回答
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 回答