当目标oracle SQL不匹配时,基于的合并查询

当目标oracle SQL不匹配时,基于的合并查询,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我想对符合特定条件的表或表的子集进行合并查询。所以我要找的是下面的东西- merge into table1 as target using table2 as Source on target.col1 = Source.col1 when matched then update when not matched by target -- row exists in source but not in targer then insert ; 我理解,oracle不支持与目标不匹配的。我想知

我想对符合特定条件的表或表的子集进行合并查询。所以我要找的是下面的东西-

merge into table1 as target using table2 as Source on target.col1 = Source.col1
when matched then update
when not matched by target -- row exists in source but not in targer
then insert ;

我理解,oracle不支持与目标不匹配的
。我想知道是否有其他方法可以在单个merge语句中执行相同的操作。基本上,我只想在源表中存在行而不是目标表中存在行时进行插入。

正如其他人所指出的那样,
BY target
可以在Oracle中删除,它可以按照您的预期工作。这里有一个包含两个表的小脚本,显示了这种行为,并且它是有效的。您希望将
temp\u test
中的所有行合并到
summary
中,这些行位于
temp\u test
中,但尚未合并到
summary

create table temp_test 
(
    DT      date,
    Foobar  varchar2(100),
    Step    varchar2(100)
);

create table summary 
(
    DT          date,
    Foobar      varchar2(100),
    Step        varchar2(100),
    OtherFields varchar2(100) NULL
);
/

insert into temp_test values (trunc(sysdate), 'test', '20'); -- should be inserted
insert into temp_test values (trunc(sysdate-1), 'test', '20'); -- already in summary

INSERT into summary (DT, Foobar, Step) VALUES (trunc(sysdate-1), 'test', '20');
select * from temp_test; -- 2 records
select * from summary; -- 1 record


merge into summary TARGET
USING temp_test SOURCE
ON (TARGET.DT = SOURCE.DT and TARGET.Foobar = SOURCE.Foobar and TARGET.Step = SOURCE.Step)
WHEN NOT MATCHED THEN
    INSERT (DT, Foobar, Step) VALUES (SOURCE.DT, SOURCE.Foobar, SOURCE.Step);
-- 1 row updated

select* from gui_po_summary; -- 2 rows

-- try to merge again, nothing should be done
merge into summary TARGET
USING temp_test SOURCE
ON (TARGET.DT = SOURCE.DT and TARGET.Foobar = SOURCE.Foobar and TARGET.Step = SOURCE.Step)
WHEN NOT MATCHED THEN
    INSERT (DT, Foobar, Step) VALUES (SOURCE.DT, SOURCE.Foobar, SOURCE.Step);
-- 0 rows

delete temp_test; -- 2 rows deleted
-- try to merge again, nothing should be done as we want WHEN NOT MATCHED BY target
merge into summary TARGET
USING temp_test SOURCE
ON (TARGET.DT = SOURCE.DT and TARGET.Foobar = SOURCE.Foobar and TARGET.Step = SOURCE.Step)
WHEN NOT MATCHED THEN
    INSERT (DT, Foobar, Step) VALUES (SOURCE.DT, SOURCE.Foobar, SOURCE.Step);
-- 0 rows

当源代码不匹配时,也有
,需要对Oracle进行特殊处理,这里给出了答案。

正如其他人所指出的那样,
BY TARGET
可以为Oracle删除,它可以按照您的预期工作。这里有一个包含两个表的小脚本,显示了这种行为,并且它是有效的。您希望将
temp\u test
中的所有行合并到
summary
中,这些行位于
temp\u test
中,但尚未合并到
summary

create table temp_test 
(
    DT      date,
    Foobar  varchar2(100),
    Step    varchar2(100)
);

create table summary 
(
    DT          date,
    Foobar      varchar2(100),
    Step        varchar2(100),
    OtherFields varchar2(100) NULL
);
/

insert into temp_test values (trunc(sysdate), 'test', '20'); -- should be inserted
insert into temp_test values (trunc(sysdate-1), 'test', '20'); -- already in summary

INSERT into summary (DT, Foobar, Step) VALUES (trunc(sysdate-1), 'test', '20');
select * from temp_test; -- 2 records
select * from summary; -- 1 record


merge into summary TARGET
USING temp_test SOURCE
ON (TARGET.DT = SOURCE.DT and TARGET.Foobar = SOURCE.Foobar and TARGET.Step = SOURCE.Step)
WHEN NOT MATCHED THEN
    INSERT (DT, Foobar, Step) VALUES (SOURCE.DT, SOURCE.Foobar, SOURCE.Step);
-- 1 row updated

select* from gui_po_summary; -- 2 rows

-- try to merge again, nothing should be done
merge into summary TARGET
USING temp_test SOURCE
ON (TARGET.DT = SOURCE.DT and TARGET.Foobar = SOURCE.Foobar and TARGET.Step = SOURCE.Step)
WHEN NOT MATCHED THEN
    INSERT (DT, Foobar, Step) VALUES (SOURCE.DT, SOURCE.Foobar, SOURCE.Step);
-- 0 rows

delete temp_test; -- 2 rows deleted
-- try to merge again, nothing should be done as we want WHEN NOT MATCHED BY target
merge into summary TARGET
USING temp_test SOURCE
ON (TARGET.DT = SOURCE.DT and TARGET.Foobar = SOURCE.Foobar and TARGET.Step = SOURCE.Step)
WHEN NOT MATCHED THEN
    INSERT (DT, Foobar, Step) VALUES (SOURCE.DT, SOURCE.Foobar, SOURCE.Step);
-- 0 rows

当源代码不匹配时,也有
,需要对Oracle进行特殊处理,这里给出了答案。

我不明白为什么需要按目标
。当不匹配时,它是否使没有它的作业成为
,然后插入…
?这正是
merge
语句的工作方式。不需要按目标选择
选项。这里没有PL/SQL,除非您要求程序解决方案。我不明白您为什么需要按目标选择
。当不匹配时,它是否使没有它的作业成为
,然后插入…
?这正是
merge
语句的工作方式。不需要按目标选择
选项。这里没有PL/SQL,除非您要求一个过程解决方案。