Oracle - 使用 INSERT 和 UPDATE 合并语句

Oracle - Merge Statement with INSERT and UPDATE

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

将一些记录合并(Insert/Update)到这个 table
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 语句中缺少什么。

谢谢!

我认为 (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);

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

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”子句。

那就是:

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 定义 table 别名 - 您需要删除该关键字

  • 必须在子查询中定义列名

我还对齐了源和目标之间的列名 table 以便查询更容易理解。

合并成 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)