【问题标题】:Merge, when matched insert合并,当匹配插入
【发布时间】:2012-08-09 02:42:39
【问题描述】:

我希望在 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。任何相同的建议都将受到欢迎。

【问题讨论】:

    标签: sql oracle


    【解决方案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 语句中使用该列名代替 &lt;&lt;timestamp column&gt;&gt;

    【讨论】:

    • 但我希望检查整个源表并检查哪些所有记录都已更新,并将更新记录的新条目添加到目标表中...那么我如何使用单次插入来做到这一点?我必须使用合并。
    • @z22 - 抱歉,我不明白。有匹配的情况和没有匹配的情况有什么不同?在您发布的问题中,您在这两种情况下都在使用INSERT
    • 就是这种情况:如果记录不存在-插入它,如果存在,保持原样并插入一条新记录以及时间戳和一个新的代理键-希望我清楚这次。
    • @z22 - 好的。是否有用于生成新代理键的序列?如果没有匹配,您不想在新行中填充时间戳列?
    • @z22 - 好的,那么我认为您仍然想要INSERT,但您想加入SELECT 中的studentstudLoad 表。更新了我的答案
    【解决方案2】:

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

    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
    /
    

    并且不要颠倒这个执行顺序!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      相关资源
      最近更新 更多