您需要使用兩個不同的SQL做兩個獨立的任務。由於MERGE不支持UPDATE子句WHEN NOT MATCHED條件。
- MERGE INSERT
- UPDATE WHERE NOT EXISTS
設置:
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
注意代替MERGE只有INSERT,你可以簡單地寫一個INSERT聲明。雖然從病房的10g
開始,MATCHED和NOT MATCHED子句是可選的,因此您可以使用單個INSERT或單個UPDATE語句。
值得注意的是,這將設置所有不匹配的值爲5.根據您的數據集和非500分數的規則(例如,如果分數是502?6000?等等),那麼您將需要添加這也適用於where子句,如果需要的話。 –
完美無缺,非常感謝。考慮到你的更新聲明有一個問題,爲什麼你的「哪裏不存在」比簡單更「優化」?像這樣: 更新標籤1 設置分數= 5 其中nrb不在(從標籤2中選擇nrb) ; –
https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:953229842074這是一個比以前鏈接的回覆更好的回覆。 –