oracle之merge語法(轉載)

star_guan2008發表於2008-03-26

MERGE 語句是Oracle9i新增的語法,用來合併UPDATE和INSERT語句。通過MERGE語句,根據一張表或子查詢的連線條件對另外一張表進行查詢, 連線條件匹配上的進行UPDATE,無法匹配的執行INSERT。這個語法僅需要一次全表掃描就完成了全部工作,執行效率要高於INSERT+ UPDATE。

SQL> CREATE TABLE MM (ID NUMBER, NAME VARCHAR2(20));

表已建立。

SQL> CREATE TABLE MN (ID NUMBER, NAME VARCHAR2(20));

表已建立。

SQL> INSERT INTO MM VALUES (1, 'A');

已建立 1 行。

SQL> INSERT INTO MN VALUES (1, 'B');

已建立 1 行。

SQL> MERGE INTO MN A
  2  USING MM B
  3  ON(A.ID=B.ID)
  4  WHEN MATCHED THEN
  5  UPDATE SET A.ID = B.ID
  6  WHEN NOT MATCHED THEN
  7  INSERT VALUES(B.ID, B.NAME);
ON(A.ID=B.ID)
   *
ERROR 位於第 3 行:
ORA-00904: "A"."ID": 無效的識別符號


SQL> MERGE INTO MN A
  2  USING MM B
  3  ON(A.ID=B.ID)
  4  WHEN MATCHED THEN
  5  UPDATE SET A.NAME = B.NAME
  6  WHEN NOT MATCHED THEN
  7  INSERT VALUES(B.ID, B.NAME);

1 行已合併。

根據測試結果,發現Oracle不允許更新用於連線的列,但是錯誤提示卻有誤導的嫌疑。

而且Oracle的SQL REFERENCE手冊上也沒有給出這個提示。

雖然文件上有這樣的描述:

MERGE is a deterministic statement. That is, you cannot update the same row of the target table multiple times in the same MERGE statement.

但是這應該是說明下面這種情況的。

當有多對一的情況出現時會出現如下錯誤

SQL> INSERT INTO MM VALUES (1, 'C');

已建立 1 行。

SQL> MERGE INTO MN A
  2  USING MM B
  3  ON(A.ID=B.ID)
  4  WHEN MATCHED THEN
  5  UPDATE SET A.NAME = B.NAME
  6  WHEN NOT MATCHED THEN
  7  INSERT VALUES(B.ID, B.NAME);
MERGE INTO MN A
           *
ERROR 位於第 1 行:
ORA-30926: 無法在源表中獲得一組穩定的行

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10742223/viewspace-217955/,如需轉載,請註明出處,否則將追究法律責任。

相關文章