2011-02-01 23 views
10

我正在尋找甲骨文MERGE聲明的確切解釋。有人可以解釋一下MERGE語句在Oracle中的真實含義嗎?

這裏就是我後:

MERGE INTO (target_table) t 
USING (source_view) s 
    ON (join condition) 
WHEN MATCHED THEN UPDATE SET col1 = val1 [, ...] 
WHEN NOT MATCHED THEN INSERT (col1 [, ...]) VALUES (val1 [, ...]) 
  • 進行什麼樣的加盟?我認爲這是全外連接,對嗎?
  • 關於WHEN MATCHED部分:當從t的行匹配s的多行時會發生什麼?
  • 關於WHEN NOT MATCHED第一部分我認爲這意味着「當s中的一行沒有對應關係時t」。我對嗎?

謝謝。

回答

11

不錯的文章,進行什麼樣的加盟?我 認爲它是全外連接,我是 對不對?

不,這是一個普通的外連接。查詢需要知道目標表中是否存在同樣位於源表中的行,以及源表中是否存在不在目標表中的記錄。由於查詢不需要響應目標表中但不在源表中的行,因此它不需要外部聯接兩種方式。

但是,如果沒有not matched子句(這是完全有效的),則不會執行外連接。優化器非常聰明,知道在這種情況下,內部連接就足夠了。

關於WHEN匹配的組件:當在T一排 多行從s匹配什麼 發生什麼呢?

當存在多個匹配時,將針對每個匹配執行更新。這意味着最後一次更新將會是提交中寫入的更新。沒有辦法規定一個訂單,所以在這種情況下,更新的來源是有效的(從一組匹配中)。

正如@ Vincent Malgrat指出的那樣,這是不正確的。如果有多個匹配,Oracle似乎會生成一個「ORA-40926:無法在源表中獲得一組穩定的行」的錯誤。

關於WHEN NOT MATCHED一部分,我相信 ,意思是「當個行有 在T沒有對應」。我對嗎?

這是正確的。

+0

謝謝,這正是我想知道的。我認爲*常規的外部連接意味着'正確連接'而不是'不連接'? – Benoit 2011-02-01 15:10:27

相關問題