1.merge into的用途
Merge是一個非常有用的功能,與DB2中的merge into功能幾乎一樣,與Mysql裡的insert into on duplicate key也很類似。MERGE INTO 是Oracle 9i以後才出現的新的功能。簡單來說可以是一個“有則更新,無則插入”的功能。
通過Merge into你能夠在一個SQL語句中對一個表同時執行inserts和updates操作. 當然是update還是insert是依據於你的指定的條件判斷的,Merge into可以實現用B表來更新A表數據,如果A表中沒有,則把B表的數據插入A表. MERGE命令從一個或多個數據源中選擇行來updating或inserting到一個或多個表 。
2.Merge into的基本語法
語法如下 :
1 MERGE [INTO [schema .] table [t_alias] 2 USING [schema .] { table | view | subquery } [t_alias] 3 ON ( condition ) 4 WHEN MATCHED THEN [merge_update_clause ] 5 WHEN NOT MATCHED THEN [merge_insert_clause];
通俗點就是如下的語法
1 MERGE INTO [表名] [表別名] 2 USING ( [查詢內容] )[或者像表查詢一樣的語句] 3 ON ([條件表達式] AND [...]...) 4 WHEN MATHED THEN [匹配的update操作] 5 WHEN NOT MATHED THEN [不匹配的insert操作]
舉個例子看看:
1 merge into Students st using newStudents nst on (st.id = nst.id) 2 when matched then 3 update set st.name = nst.name 4 when not matched then 5 insert values(nst.id, nst.name, nst.sex)
前面的merger into Students using newStudents 意思是用newStudents表來merge到Students表,匹配關系就是根據on後面的條件子句的內容,這裡根據兩個表的id來進行匹配,那麼匹配上了我們的操作是就是when matched then的子句裡的動作了,這裡的動作是update set st.name =nst.name, 就是把newStudents裡的name,賦值到Students的name裡。如果沒有匹配上則insert這樣的一條語句進去。通過這個簡單的小例子,這個merget inot的用法還是比較容易理解的。這裡merger into的功能,好比比較,然後選擇更新或者是插入,像是武術套路的一套組合拳。在做merge into的時候,這樣同樣的情況下,merge的性能是優於同等功能的update/insert語句的。有分析說merge into是單純的insert/update效率的好幾倍,本人沒有考究過,不做評論 。
3.Oracle 10g後的改進
在Oracle 10g中MERGE有如下一些改進:
1、UPDATE或INSERT子句是可選的
2、UPDATE和INSERT子句可以加WHERE子句
3、在ON條件中使用常量過濾謂詞來insert所有的行到目標表中,不需要連接源表和目標表
4、UPDATE子句後面可以跟DELETE子句來去除一些不需要的行