合并时,匹配插入

时间:2012-08-12 18:25:55

标签: sql oracle

我希望在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。对此有任何建议都是值得欢迎的。

2 个答案:

答案 0 :(得分: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表实际上有一列用于存储当前时间戳 - 在上面的SQL语句中使用该列名代替<<timestamp column>>

答案 1 :(得分:1)

这不应该通过合并来完成(正如Justin所说)但是有两个插入。 每一场比赛只有一行(也就是您在评论中说的重复匹配),然后是学生的所有行。这可以通过以下方式完成。

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
/

并且不要反转此执行顺序!!!