轉:Oracle中merge into的使用

来源:http://www.cnblogs.com/lcngu/archive/2016/03/08/5256189.html
-Advertisement-
Play Games

最近項目上使用Oracle的Merge,所以找來一下資料學習瞭解。 該命令使用一條語句從一個或者多個數據源中完成對錶的更新和插入數據. ORACLE 9i 中,使用此命令必須同時指定UPDATE 和INSERT 關鍵詞,ORACLE 10g 做瞭如下改動。 特點: 1、insert 和update是


  最近項目上使用Oracle的Merge,所以找來一下資料學習瞭解。

  該命令使用一條語句從一個或者多個數據源中完成對錶的更新和插入數據. ORACLE 9i 中,使用此命令必須同時指定UPDATE 和INSERT 關鍵詞,ORACLE 10g 做瞭如下改動。

  特點:

  1、insert 和update是可選的 ;  

  2、UPDATE 和INSERT 後面可以跟WHERE 子句 ;

  3、在ON條件中可以使用常量來insert 所有的行到目標表中,不需要連接到源表和目標表 ;

  4、UPDATE 子句後面可以跟delete 來去除一些不需要的行。

  舉例:

  1    create table PRODUCTS   
  2     (   
  3     PRODUCT_ID INTEGER,   
  4     PRODUCT_NAME VARCHAR2(60),   
  5     CATEGORY VARCHAR2(60)   
  6     );   
  7   
  8     insert into PRODUCTS values (1501, 'VIVITAR 35MM', 'ELECTRNCS');   
  9     insert into PRODUCTS values (1502, 'OLYMPUS IS50', 'ELECTRNCS');   
 10     insert into PRODUCTS values (1600, 'PLAY GYM', 'TOYS');   
 11     insert into PRODUCTS values (1601, 'LAMAZE', 'TOYS');   
 12     insert into PRODUCTS values (1666, 'HARRY POTTER', 'DVD');   
 13     commit;   
 14   
 15     create table NEWPRODUCTS   
 16     (   
 17     PRODUCT_ID INTEGER,   
 18     PRODUCT_NAME VARCHAR2(60),   
 19     CATEGORY VARCHAR2(60)   
 20     );   
 21   
 22     insert into NEWPRODUCTS values (1502, 'OLYMPUS CAMERA', 'ELECTRNCS');   
 23     insert into NEWPRODUCTS values (1601, 'LAMAZE', 'TOYS');   
 24     insert into NEWPRODUCTS values (1666, 'HARRY POTTER', 'TOYS');   
 25     insert into NEWPRODUCTS values (1700, 'WAIT INTERFACE', 'BOOKS');   
 26     commit;   
 27 1,可省略的update 或者insert
 28       MERGE INTO products p   
 29     2 USING newproducts np   
 30     3 ON (p.product_id = np.product_id)   
 31     4 WHEN MATCHED THEN  
 32     5 UPDATE  
 33     6 SET p.product_name = np.product_name,   
 34     7 p.category = np.category;
 35   使用表newproducts中的product_name 和category欄位來更新表products 中相同product_id的product_name 和category.
 36 
 37 2,當條件不滿足的時候把newproducts表中的數據INSERT 到表products中。
 38 
 39     MERGE INTO products p   
 40     USING newproducts np   
 41      ON (p.product_id = np.product_id)   
 42      WHEN NOT MATCHED THEN  
 43      INSERT  
 44      VALUES (np.product_id, np.product_name,   
 45      np.category);   
 46 3,帶條件的insert 和update
 47 
 48  MERGE INTO products p   
 49  USING newproducts np   
 50    ON (p.product_id = np.product_id)   
 51    WHEN MATCHED THEN  
 52    UPDATE  
 53    SET p.product_name = np.product_name   
 54    WHERE p.category = np.category;
 55  insert 和update 都帶有where 字句
 56 
 57 
 58  
 59 MERGE INTO products p   
 60  USING newproducts np   
 61     ON (p.product_id = np.product_id)   
 62     WHEN MATCHED THEN  
 63     UPDATE  
 64      SET p.product_name = np.product_name,   
 65      p.category = np.category   
 66     WHERE p.category = 'DVD'  
 67     WHEN NOT MATCHED THEN  
 68      INSERT  
 69      VALUES (np.product_id, np.product_name, np.category)   
 70     WHERE np.category != 'BOOKS'  
 71 4,無條件的insert
 72 
 73 MERGE INTO products p   
 74  USING newproducts np   
 75   ON (1=0)   
 76   WHEN NOT MATCHED THEN  
 77    INSERT  
 78    VALUES (np.product_id, np.product_name, np.category)   
 79    WHERE np.category = 'BOOKS'  
 80 5delete 子句
 81 
 82   merge into products p
 83   2  using newproducts np
 84   3  on(p.product_id = np.product_id)
 85   4  when matched then
 86   5  update
 87   6  set p.product_name = np.product_name
 88   7  delete where category = 'macle1_cate';
 89 
 90 select *
 91 
 92 from products;
 93 
 94  PRODUCT_ID PRODUCT_NAME         CATEGORY
 95 --------------------------------------- -------------------- --------------------
 96                                    1502 macle22              macle2_cate
 97                                    1503 macle3                macle2_cate
 98                                    1504 macle                  macle1_cate
 99                                    1505 macle5                macle5_cate
100 
101 1504 中的macle1_cate 滿足delete where,但是不滿足 on 中的條件,所以沒有被刪除。!!!!!!

  在進行SQL語句編寫時,我們經常會遇到大量的同時進行Insert/Update的語句 ,也就是說當存在記錄時,就更新(Update),不存在數據時,就插入(Insert)。

  Merge格式:

1 MERGE INTO table_name alias1 
2 USING (table|view|sub_query) alias2
3 ON (join condition) 
4 WHEN MATCHED THEN 
5     UPDATE table_name 
6     SET col1 = col_val1, 
7         col2     = col2_val 
8 WHEN NOT MATCHED THEN 
9     INSERT (column_list) VALUES (column_values);

  用中文來解釋Merge語法,就是:

  在alias2中Select出來的數據,每一條都跟alias1進行 ON (join condition)的比較,如果匹配,就進行更新的操作(Update),如果不匹配,就進行插入操作(Insert)。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Android 五大佈局: FrameLayout(框架佈局),LinearLayout (線性佈局),AbsoluteLayout(絕對佈局),RelativeLayout(相對佈局),TableLayout(表格佈局)。 FrameLayout 所有東西依次都放在左上角,會重疊,這個佈局比較簡單
  • 因為以前一直是試用版,重啟伺服器之後,突然資料庫不能訪問,提示評估期已過,都快嚇死了。還好找到瞭解決辦法特copy解決步驟如下: (筆者用的是企業版: R88PF-GMCFT-KM2KR-4R7GB-43K4B) 第一步:進入SQL2008配置工具中的安裝中心第二步:再進入維護界面,選擇版本升級第三
  • 每天零點備份一次資料庫,備份文件放在指定目錄(如果目錄不存在則新建),按月存儲; 將下麵這段命令存儲為一個 *.bat 文件,添加一個Windows任務計劃程式(Task scheduler)指向這個文件,每天執行一次即可。 rem *******************************Co
  • Redis是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。
  • select top 1 * from msdb..restorehistorywhere destination_database_name='資料庫名稱'order by restore_date desc
  • 概述 為了提高併發MySQL加入了多版本併發控制,它把舊版本記錄保存在了共用表空間,在事務未提交之前對應的行記錄還是受到鎖的限制,當事務提交之後對應的記錄行就在緩存中被修改了記錄也被持久化了,當刷新線程按一定的規律進行刷新的時候行的修改記錄被刷新到了物理數據頁中,並且共用表空間的中的舊版本記錄頁也被
  • 1.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如: select id from t where num is null 可以在
  • 第1題: 設有商店和顧客兩個實體,“商店”有屬性:商店編號、商店名、地址、電話,“顧客”有屬性:顧客編號、姓名、地址、年齡、性別。假設一個商店有多個顧客購物,一個顧客可以到多個商店購物,顧客每次去商店購物有一個消費金額和日期,而且規定每個顧客在每個商店裡每天最多消費一次。 ① 試畫出ER圖,並註明屬
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...