您需要使用两个不同的 SQL 执行两个单独的任务。因为 MERGE 不支持 WHEN NOT MATCHED 条件的 UPDATE 子句。
设置:
SQL> CREATE TABLE t1(
2 nrb VARCHAR2(10), score NUMBER, note VARCHAR2(10), SOURCE VARCHAR2(10)
3 );
Table created.
SQL> INSERT INTO t1 VALUES('nrb1', 500, 'abc', 'e1');
1 row created.
SQL> INSERT INTO t1 VALUES('nrb2', 500, 'def', 'e1');
1 row created.
SQL> COMMIT;
Commit complete.
SQL> CREATE TABLE t2(
2 nrb VARCHAR2(10), score NUMBER, note VARCHAR2(10), SOURCE VARCHAR2(10)
3 );
Table created.
SQL> INSERT INTO t2 VALUES('nrb1', 500, 'gls', 'e1');
1 row created.
SQL> INSERT INTO t2 VALUES('nrb3', 500, 'dls', 'e1');
1 row created.
SQL> COMMIT;
Commit complete.
MERGE INSERT:插入不匹配的行
SQL> MERGE INTO t1
2 USING t2
3 ON (t1.nrb = t2.nrb)
4 WHEN NOT MATCHED THEN
5 INSERT
6 (
7 nrb,
8 score,
9 note,
10 SOURCE
11 )
12 VALUES
13 (
14 t2.nrb,
15 t2.score,
16 t2.note,
17 t2.SOURCE
18 );
1 row merged.
SQL> COMMIT;
Commit complete.
SQL> SELECT * FROM t1;
NRB SCORE NOTE SOURCE
---------- ---------- ---------- ----------
nrb1 500 abc e1
nrb2 500 def e1
nrb3 500 dls e1
UPDATE 语句:用自定义值更新不匹配的行
SQL> UPDATE t1
2 SET score = 5
3 WHERE NOT EXISTS (SELECT NULL
4 FROM t2
5 WHERE t1.nrb = t2.nrb);
1 row updated.
SQL> COMMIT;
Commit complete.
SQL> SELECT * FROM t1;
NRB SCORE NOTE SOURCE
---------- ---------- ---------- ----------
nrb1 500 abc e1
nrb2 5 def e1
nrb3 500 dls e1
NOTE 您可以简单地编写一个 INSERT 语句,而不是仅使用 INSERT 的 MERGE。虽然,从10g 起,The MATCHED 和 NOT MATCHED 子句是可选的,因此您可以有单个 INSERT 或单个 UPDATE 语句。