我希望在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
。对此有任何建议都是值得欢迎的。
答案 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
/
并且不要反转此执行顺序!!!