【问题标题】:Oracle - Merge Statement with INSERT and UPDATEOracle - 带有 INSERT 和 UPDATE 的合并语句
【发布时间】:2021-03-27 08:40:08
【问题描述】:

我有一个名为 TextData 的现有表,其中包含 TextId 和 Text 字段。 在下面的语句中,我尝试使用 -

将一些记录合并(插入/更新)到该表中
MERGE INTO maestro.TEXTDATA T
USING ( 
select N'/Common/UserStatusExpired', N'Expired' from dual
union all select N'/Common/UserStatusPwdExpired', N'Pwd Expired' from dual
) AS Source (Id, Txt) ON (T.TEXTID = Source.Id)
WHEN MATCHED THEN
    UPDATE SET TEXT = Source.Txt
WHEN NOT MATCHED THEN
    INSERT (TEXTID, TEXT) VALUES(Source.Id, Source.Txt);

然而,得到这个错误 -

missing ON keyword

谁能建议我在 Merge 语句中缺少什么。

谢谢!

【问题讨论】:

    标签: sql oracle sql-update sql-insert


    【解决方案1】:

    那就是:

    MERGE INTO textdata t
    USING ( 
        SELECT N'/Common/UserStatusExpired' AS textid, N'Expired' AS text FROM DUAL
        UNION ALL SELECT N'/Common/UserStatusPwdExpired', N'Pwd Expired' FROM DUAL
    ) s ON (t.textid = s.textid )
    WHEN MATCHED THEN
        UPDATE SET text = s.text
    WHEN NOT MATCHED THEN
        INSERT (textid, text) VALUES(s.textid, s.text);
    

    理由:

    • Oracle 不支持 AS 定义表别名 - 您需要删除该关键字

    • 列名必须定义在子查询

    我还对齐了源表和目标表之间的列名,这样查询更容易理解。

    【讨论】:

      【解决方案2】:

      我认为(Id, Txt) 不应该像以前那样存在。

      MERGE INTO maestro.TEXTDATA T
      USING ( 
          select N'/Common/UserStatusExpired' id, N'Expired' txt from dual
          union all 
          select N'/Common/UserStatusPwdExpired' id, N'Pwd Expired' txt from dual
          ) AS Source  ON (T.TEXTID = Source.Id)
      WHEN MATCHED THEN
           UPDATE SET TEXT = Source.Txt
      WHEN NOT MATCHED THEN
           INSERT (TEXTID, TEXT) VALUES(Source.Id, Source.Txt);
      

      【讨论】:

      • Oracle 不支持AS 为派生表定义别名。
      【解决方案3】:

      问题在于您指定的“as”子句。看起来您想在联合选择列表中命名您的列。

      MERGE INTO maestro.TEXTDATA T
      USING ( 
      select N'/Common/UserStatusExpired' id, N'Expired' txt from dual
      union all select N'/Common/UserStatusPwdExpired' id, N'Pwd Expired' txt from dual
      ) source ON (T.TEXTID = Source.Id)
      WHEN MATCHED THEN
          UPDATE SET TEXT = Source.Txt
      WHEN NOT MATCHED THEN
          INSERT (TEXTID, TEXT) VALUES(Source.Id, Source.Txt)
      

      railroad diagram 表明没有这样的“as”子句。

      【讨论】:

      • USING 子查询在这里需要一个别名。
      【解决方案4】:

      合并到 maestro.TEXTDATA T 使用 ( select N'/Common/UserStatusExpired' id, N'Expired' txt from dual union all select N'/Common/UserStatusPwdExpired' id, N'Pwd Expired' txt from dual ) 源开启 (T.TEXTID = Source.Id) 当匹配然后 更新集文本 = Source.Txt 当不匹配时 插入(TEXTID,TEXT)值(Source.Id,Source.Txt)

      【讨论】:

        猜你喜欢
        • 2016-01-22
        • 1970-01-01
        • 2013-12-26
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 2015-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多