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)
我有一个名为 TextData 的现有 table,其中包含字段 TextId 和 Text。 在下面的语句中,我试图使用 -
将一些记录合并(Insert/Update)到这个 tableMERGE 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)