日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

merge语句

發布時間:2025/4/14 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 merge语句 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

把數據從一個表復制到另一個表,插入新數據或替換掉老數據是每一個ORACLE DBA都會經常碰到的問題。在ORACLE9i以前的年代,我們要先查找是否存在老數據,如果有用UPDATE替換,否則用INSERT語句插入,其間少不了還有一些標記變量等等,繁瑣的很。現在ORACLE9i專為這種情況提供了MERGE語句,使這一工作變得異常輕松。MERGE語句的語法如下:

MERGE [hint] INTO [schema .] table [t_alias] USING [schema .] { table | view | subquery } [t_alias] ON ( condition ) WHEN MATCHED THEN merge_update_clause WHEN NOT MATCHED THEN merge_insert_clause; 例如: MERGE INTO tdest d USING tsrc s ON (s.srckey = d.destkey) WHEN MATCHED THEN UPDATE SET d.destdata = d.destdata + s.srcdata WHEN NOT MATCHED THEN INSERT (destkey,destdata) VALUES (srckey,srcdata) 一條語句代替了原來的一段復雜語句 在Oracle 10g中MERGE有如下一些改進:

?/P>

1、UPDATE或INSERT子句是可選的

?/P>

2、UPDATE和INSERT子句可以加WHERE子句

?/P>

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

?/P>

4、UPDATE子句后面可以跟DELETE子句來去除一些不需要的行

?/P>

首先創建示例表:

?/P>

create table PRODUCTS ???? ( ???? PRODUCT_ID INTEGER, ???? PRODUCT_NAME VARCHAR2(60), ???? CATEGORY VARCHAR2(60) ???? ); ???? insert into PRODUCTS values (1501, 'VIVITAR 35MM', 'ELECTRNCS'); ???? insert into PRODUCTS values (1502, 'OLYMPUS IS50', 'ELECTRNCS'); ???? insert into PRODUCTS values (1600, 'PLAY GYM', 'TOYS'); ???? insert into PRODUCTS values (1601, 'LAMAZE', 'TOYS'); ???? insert into PRODUCTS values (1666, 'HARRY POTTER', 'DVD'); ???? commit; ???? create table NEWPRODUCTS ???? ( ???? PRODUCT_ID INTEGER, ???? PRODUCT_NAME VARCHAR2(60), ???? CATEGORY VARCHAR2(60) ???? ); ???? insert into NEWPRODUCTS values (1502, 'OLYMPUS CAMERA', 'ELECTRNCS'); ???? insert into NEWPRODUCTS values (1601, 'LAMAZE', 'TOYS'); ???? insert into NEWPRODUCTS values (1666, 'HARRY POTTER', 'TOYS'); ???? insert into NEWPRODUCTS values (1700, 'WAIT INTERFACE', 'BOOKS'); ???? commit;

1、可省略的UPDATE或INSERT子句

?/P>

在Oracle 9i, MERGE語句要求你必須同時指定INSERT和UPDATE子句.而在Oracle 10g, 你可以省略UPDATE或INSERT子句中的一個. 下面的例子根據表NEWPRODUCTS的PRODUCT_ID字段是否匹配來updates表PRODUCTS的信息:

?/P>

SQL> MERGE INTO products p ???? 2 USING newproducts np ???? 3 ON (p.product_id = np.product_id) ???? 4 WHEN MATCHED THEN ???? 5 UPDATE ???? 6 SET p.product_name = np.product_name, ???? 7 p.category = np.category; ???? 3 rows merged. ???? SQL> SELECT * FROM products; ???? PRODUCT_ID PRODUCT_NAME CATEGORY ???? ---------- -------------------- ---------- ???? 1501 VIVITAR 35MM ELECTRNCS ???? 1502 OLYMPUS CAMERA ELECTRNCS ???? 1600 PLAY GYM TOYS ???? 1601 LAMAZE TOYS ???? 1666 HARRY POTTER TOYS ???? SQL> ???? SQL> ROLLBACK; ???? Rollback complete. ???? SQL>

?/P>

?/P>

?/P>

在上面例子中, MERGE語句影響到是產品id為1502, 1601和1666的行. 它們的產品名字和種類被更新為表newproducts中的值. 下面例子省略UPDATE子句, 把表NEWPRODUCTS中新的PRODUCT_ID插入到表PRODUCTS中, 對于在兩個表中能夠匹配上PRODUCT_ID的數據不作任何處理. 從這個例子你能看到PRODUCT_ID=1700的行被插入到表PRODUCTS中.

?/P>

SQL> MERGE INTO products p ???? 2 USING newproducts np ???? 3 ON (p.product_id = np.product_id) ???? 4 WHEN NOT MATCHED THEN ???? 5 INSERT ???? 6 VALUES (np.product_id, np.product_name, ???? 7 np.category); ???? 1 row merged. ???? SQL> SELECT * FROM products; ???? PRODUCT_ID PRODUCT_NAME CATEGORY ???? ---------- -------------------- ---------- ???? 1501 VIVITAR 35MM ELECTRNCS ???? 1502 OLYMPUS IS50 ELECTRNCS ???? 1600 PLAY GYM TOYS ???? 1601 LAMAZE TOYS ???? 1666 HARRY POTTER DVD ???? 1700 WAIT INTERFACE BOOKS

2、帶條件的Updates和Inserts子句

?/P>

你能夠添加WHERE子句到UPDATE或INSERT子句中去, 來跳過update或insert操作對某些行的處理. 下面例子根據表NEWPRODUCTS來更新表PRODUCTS數據, 但必須字段CATEGORY也得同時匹配上:

?/P>

SQL> MERGE INTO products p ???? 2 USING newproducts np ???? 3 ON (p.product_id = np.product_id) ???? 4 WHEN MATCHED THEN ???? 5 UPDATE ???? 6 SET p.product_name = np.product_name ???? 7 WHERE p.category = np.category; ???? 2 rows merged. ???? SQL> SELECT * FROM products; ???? PRODUCT_ID PRODUCT_NAME CATEGORY ???? ---------- -------------------- ---------- ???? 1501 VIVITAR 35MM ELECTRNCS ???? 1502 OLYMPUS CAMERA ELECTRNCS ???? 1600 PLAY GYM TOYS ???? 1601 LAMAZE TOYS ???? 1666 HARRY POTTER DVD ???? SQL> ???? SQL> rollback;

?/P>

?/P>

?/P>

在這個例子中, 產品ID為1502,1601和1666匹配ON條件但是1666的category不匹配. 因此MERGE命令只更新兩行數據. 下面例子展示了在Updates和Inserts子句都使用WHERE子句:

?/P>

SQL> MERGE INTO products p ???? 2 USING newproducts np ???? 3 ON (p.product_id = np.product_id) ???? 4 WHEN MATCHED THEN ???? 5 UPDATE ???? 6 SET p.product_name = np.product_name, ???? 7 p.category = np.category ???? 8 WHERE p.category = 'DVD' ???? 9 WHEN NOT MATCHED THEN ???? 10 INSERT ???? 11 VALUES (np.product_id, np.product_name, np.category) ???? 12 WHERE np.category != 'BOOKS' ???? SQL> / ???? 1 row merged. ???? SQL> SELECT * FROM products; ???? PRODUCT_ID PRODUCT_NAME CATEGORY ???? ---------- -------------------- ---------- ???? 1501 VIVITAR 35MM ELECTRNCS ???? 1502 OLYMPUS IS50 ELECTRNCS ???? 1600 PLAY GYM TOYS ???? 1601 LAMAZE TOYS ???? 1666 HARRY POTTER TOYS ???? SQL>

?/P>

?/P>

注意由于有WHERE子句INSERT沒有插入所有不匹配ON條件的行到表PRODUCTS.

3、無條件的Inserts

?/P>

你能夠不用連接源表和目標表就把源表的數據插入到目標表中. 這對于你想插入所有行到目標表時是非常有用的. Oracle 10g現在支持在ON條件中使用常量過濾謂詞. 舉個常量過濾謂詞例子ON (1=0). 下面例子從源表插入行到表PRODUCTS, 不檢查這些行是否在表PRODUCTS中存在:






?/P>

SQL> MERGE INTO products p ???? 2 USING newproducts np ???? 3 ON (1=0) ???? 4 WHEN NOT MATCHED THEN ???? 5 INSERT ???? 6 VALUES (np.product_id, np.product_name, np.category) ???? 7 WHERE np.category = 'BOOKS' ???? SQL> / ???? 1 row merged. ???? SQL> SELECT * FROM products; ???? PRODUCT_ID PRODUCT_NAME CATEGORY ???? ---------- -------------------- ---------- ???? 1501 VIVITAR 35MM ELECTRNCS ???? 1502 OLYMPUS IS50 ELECTRNCS ???? 1600 PLAY GYM TOYS ???? 1601 LAMAZE TOYS ???? 1666 HARRY POTTER DVD ???? 1700 WAIT INTERFACE BOOKS ???? 6 rows selected. ???? SQL>

?/P>

?/P>

?/P>

4、新增加的DELETE子句

?/P>

Oracle 10g中的MERGE提供了在執行數據操作時清除行的選項. 你能夠在WHEN MATCHED THEN UPDATE子句中包含DELETE子句. DELETE子句必須有一個WHERE條件來刪除匹配某些條件的行.匹配DELETE WHERE條件但不匹配ON條件的行不會被從表中刪除.

?/P>

下面例子驗證DELETE子句. 我們從表NEWPRODUCTS中合并行到表PRODUCTS中, 但刪除category為ELECTRNCS的行.

?/P>

SQL> MERGE INTO products p ???? 2 USING newproducts np ???? 3 ON (p.product_id = np.product_id) ???? 4 WHEN MATCHED THEN ???? 5 UPDATE ???? 6 SET p.product_name = np.product_name, ???? 7 p.category = np.category ???? 8 DELETE WHERE (p.category = 'ELECTRNCS') ???? 9 WHEN NOT MATCHED THEN ???? 10 INSERT ???? 11 VALUES (np.product_id, np.product_name, np.category) ???? SQL> / ???? 4 rows merged. ???? SQL> SELECT * FROM products; ???? PRODUCT_ID PRODUCT_NAME CATEGORY ???? ---------- -------------------- ---------- ???? 1501 VIVITAR 35MM ELECTRNCS ???? 1600 PLAY GYM TOYS ???? 1601 LAMAZE TOYS ???? 1666 HARRY POTTER TOYS ???? 1700 WAIT INTERFACE BOOKS ???? SQL>

?/P>

?/P>

?/P>

產品ID為1502的行從表PRODUCTS中被刪除, 因為它同時匹配ON條件和DELETE WHERE條件. 產品ID為1501的行匹配DELETE WHERE條件但不匹配ON條件, 所以它沒有被刪除. 產品ID為1700 的行不匹配ON條件, 所以被插入表PRODUCTS. 產品ID為1601和1666的行匹配ON條件但不匹配DELETE WHERE條件, 所以被更新為表NEWPRODUCTS中的值.

轉載于:https://www.cnblogs.com/weixun/archive/2013/04/15/3022962.html

總結

以上是生活随笔為你收集整理的merge语句的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕免费在线观看 | 亚洲最大的成人网 | 色射视频 | 天堂av在线中文 | 深夜福利一区 | 成人欧美激情 | 欧美成人午夜电影 | 国产黑丝视频 | 日韩精品人妻中文字幕 | 67194国产| 午夜xxx | 欧美69久成人做爰视频 | 亚洲日日干 | 中文在线a√在线 | 久久天天操 | 国产欧美一区二区在线观看 | 日韩av中字 | 国产精品亚洲成在人线 | 免费黄色小视频 | 在线看免费av | 日韩va视频 | 在线观看免费福利 | 免费超爽大片黄 | 久久中文字幕视频 | 久久久国产精品黄毛片 | 久久对白| 好吊色在线观看 | 日韩一级免费毛片 | 色窝网 | a级特黄视频 | 精品国产乱码久久久久久蜜臀网站 | 本道久久 | 成人免费大全 | 老司机午夜在线 | 韩国禁欲系高级感电影 | 献给魔王伊伏洛基亚吧动漫在线观看 | 快灬快灬一下爽69 | 免费国产一区二区三区 | 中文欧美日韩 | xxxxx色 | 国产妇女视频 | 国产又粗又黄 | 色屋在线 | 欧美精品成人一区二区在线观看 | 波多野结衣爱爱 | 91系列在线观看 | 国产日产欧洲无码视频 | 在线免费看av | 免费成人在线观看 | 日韩高清一区二区 | 日韩视频不卡 | 日本aⅴ在线观看 | 婷婷五月花 | www.亚色 | 亚洲色精品三区二区一区 | h片在线免费观看 | 国产午夜精品视频 | 激情亚洲天堂 | 国产激情视频在线播放 | 夜色一区| 最新成人在线 | 欧美日韩二三区 | 亚洲咪咪 | 污污网站免费 | 91精品久久久久久久久 | 国产精品一区二区av | 丰满人妻一区二区 | 亚洲国产精品网站 | 中文字幕一二区 | 欧美日韩不卡视频 | 国产二级一片内射视频播放 | 理论片在线观看理伦片 | 美女涩涩视频 | 成人h在线观看 | 国产成人久久 | 秘密基地动漫在线观看免费 | 亚洲欧美va天堂人熟伦 | 美女被男人c | 中文一区二区在线 | 亚洲国产在 | 国产人妻黑人一区二区三区 | 正在播放adn156松下纱荣子 | 女人喂男人奶水做爰视频 | 啪啪的网站 | 国产在线久久久 | 久久久久国产精品无码免费看 | 一区二区乱码 | 成人免费黄色网 | 免费观看在线观看 | 少妇高潮大叫好爽喷水 | 久久久久久久影院 | 精品久久久久久久无码 | 沈樵精品国产成av片 | 污污的视频在线免费观看 | 久久精品一二 | 天天做天天躁天天躁 | 欧美日韩一区不卡 | 未满十八岁禁止进入 | 欧美精品18 |