oracle中merge 語句使用
轉:http://honeybinshun.iteye.com/blog/1236775
Oracle在9i引入了merge命令,
透過這個merge你能夠在一個SQL語句中對一個表同時執行inserts和updates操作. 當然是update還是insert是依據於你的指定的條件判斷的,Merge into可以實現用B表來更新A表資料,如果A表中沒有,則把B表的資料插入A表. MERGE命令從一個或多個資料來源中選擇行來updating或inserting到一個或多個表
語法如下
MERGE INTO [your table-name] [rename your table here]
USING ( [write your query here] )[rename your query-sql and using just like a table]
ON ([conditional expression here] AND [...]...)
WHEN MATHED THEN [here you can execute some update sql or something else ]
WHEN NOT MATHED THEN [execute something else here ! ]
我們先看看一個簡單的例子,來介紹一個merge into的用法
merge into products p using newproducts np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name
when not matched then
insert values(np.product_id, np.product_name, np.category)
在這個例子裡。前面的merger into products using newproducts 表示的用newproducts表來merge到products表,merge的匹配關係就是on後面的條件子句的內容,這裡根據兩個表的 product_id來進行匹配,那麼匹配上了我們的操作是就是when matched then的子句裡的動作了,這裡的動作是update set p.product_name = np.product_name, 很顯然就是把newproduct裡的內容,賦值到product的product_name裡。如果沒有匹配上則insert這樣的一條語句進去。 大家看看這個merget inot的用法是不是一目瞭然了呀。這裡merger的功能,好比比較,然後選擇更新或者是插入,是一系列的組合拳,在做merge的時候,這樣同樣的情 況下,merge的效能是優於同等功能的update/insert語句的。有人曾經分析merge是批次處理對效能貢獻很大,個人覺得這個是沒有考據 的。
我們也可以在using後面使用檢視或者子查詢。比如我們把newproducts換成
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name
when not matched then
insert values(np.product_id, np.product_name, np.category)
也是可以的。
在Oracle 10g中MERGE有如下一些改進:
1、UPDATE或INSERT子句是可選的
2、UPDATE和INSERT子句可以加WHERE子句
3、在ON條件中使用常量過濾謂詞來insert所有的行到目標表中,不需要連線源表和目標表
4、UPDATE子句後面可以跟DELETE子句來去除一些不需要的行
我們透過例項來一一看看如上的新特性
1. UPDATE或INSERT子句是可選的
在9i裡由於必須insert into和update都要存在,也就是不是update就是insert,不支援單一的操作,雖然還是可以曲線救國,呵呵 但是有些過於強勢了。而10g裡就是可選了,能符合我們更多的需求了
比如上面的句子
我們可以只存在update或者insert
merge into products p using newproducts np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name
這裡,如果匹配就更新,不存在就不管了。
2. UPDATE和INSERT子句可以加WHERE子句
這也是一個功能性的改進,能夠符合我們更多的需求,這個where的作用很明顯是一個過濾的條件,是我們加入一些額外的條件,對只對滿足where條件的進行更新和insert
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name where np.product_name like 'OL%'
這裡表示只是對product_name開頭是'OL'的匹配上的進行update,如果開頭不是'OL'的就是匹配了也不做什麼事情,insert裡也可以加入where
比如
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name where np.product_name like 'OL%'
when not matched then
insert values(np.product_id, np.product_name, np.category) where np.product_name like 'OL%'
這裡注意比較一下,他們返回的結果行數,是有著差異的。
3. 在ON條件中使用常量過濾謂詞來insert所有的行到目標表中,不需要連線源表和目標表
merge into products p using (select * from newproducts) np on (1=0)
when matched then
update set p.product_name = np.product_name
when not matched then
insert values(np.product_id, np.product_name, np.category)
個人覺得這個功能沒有太大的意義,我們的insert into本身就支援這樣的功能,沒有必要使用merge
4. UPDATE子句後面可以跟DELETE子句來去除一些不需要的行
delete只能和update配合,從而達到刪除滿足where條件的子句的紀錄
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name delete where p.product_id = np.product_id where np.product_name like 'OL%'
when not matched then
insert values(np.product_id, np.product_name, np.category)
這裡我們達到的目的就是 會把匹配的記錄的prodcut_name更新到product裡,並且把product_name開頭為OL的刪除掉。
merge into也是一個dml語句,和其他的dml語句一樣需要透過rollback和commit 結束事務。
Oracle在9i引入了merge命令,
透過這個merge你能夠在一個SQL語句中對一個表同時執行inserts和updates操作. 當然是update還是insert是依據於你的指定的條件判斷的,Merge into可以實現用B表來更新A表資料,如果A表中沒有,則把B表的資料插入A表. MERGE命令從一個或多個資料來源中選擇行來updating或inserting到一個或多個表
語法如下
MERGE INTO [your table-name] [rename your table here]
USING ( [write your query here] )[rename your query-sql and using just like a table]
ON ([conditional expression here] AND [...]...)
WHEN MATHED THEN [here you can execute some update sql or something else ]
WHEN NOT MATHED THEN [execute something else here ! ]
我們先看看一個簡單的例子,來介紹一個merge into的用法
merge into products p using newproducts np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name
when not matched then
insert values(np.product_id, np.product_name, np.category)
在這個例子裡。前面的merger into products using newproducts 表示的用newproducts表來merge到products表,merge的匹配關係就是on後面的條件子句的內容,這裡根據兩個表的 product_id來進行匹配,那麼匹配上了我們的操作是就是when matched then的子句裡的動作了,這裡的動作是update set p.product_name = np.product_name, 很顯然就是把newproduct裡的內容,賦值到product的product_name裡。如果沒有匹配上則insert這樣的一條語句進去。 大家看看這個merget inot的用法是不是一目瞭然了呀。這裡merger的功能,好比比較,然後選擇更新或者是插入,是一系列的組合拳,在做merge的時候,這樣同樣的情 況下,merge的效能是優於同等功能的update/insert語句的。有人曾經分析merge是批次處理對效能貢獻很大,個人覺得這個是沒有考據 的。
我們也可以在using後面使用檢視或者子查詢。比如我們把newproducts換成
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name
when not matched then
insert values(np.product_id, np.product_name, np.category)
也是可以的。
在Oracle 10g中MERGE有如下一些改進:
1、UPDATE或INSERT子句是可選的
2、UPDATE和INSERT子句可以加WHERE子句
3、在ON條件中使用常量過濾謂詞來insert所有的行到目標表中,不需要連線源表和目標表
4、UPDATE子句後面可以跟DELETE子句來去除一些不需要的行
我們透過例項來一一看看如上的新特性
1. UPDATE或INSERT子句是可選的
在9i裡由於必須insert into和update都要存在,也就是不是update就是insert,不支援單一的操作,雖然還是可以曲線救國,呵呵 但是有些過於強勢了。而10g裡就是可選了,能符合我們更多的需求了
比如上面的句子
我們可以只存在update或者insert
merge into products p using newproducts np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name
這裡,如果匹配就更新,不存在就不管了。
2. UPDATE和INSERT子句可以加WHERE子句
這也是一個功能性的改進,能夠符合我們更多的需求,這個where的作用很明顯是一個過濾的條件,是我們加入一些額外的條件,對只對滿足where條件的進行更新和insert
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name where np.product_name like 'OL%'
這裡表示只是對product_name開頭是'OL'的匹配上的進行update,如果開頭不是'OL'的就是匹配了也不做什麼事情,insert裡也可以加入where
比如
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name where np.product_name like 'OL%'
when not matched then
insert values(np.product_id, np.product_name, np.category) where np.product_name like 'OL%'
這裡注意比較一下,他們返回的結果行數,是有著差異的。
3. 在ON條件中使用常量過濾謂詞來insert所有的行到目標表中,不需要連線源表和目標表
merge into products p using (select * from newproducts) np on (1=0)
when matched then
update set p.product_name = np.product_name
when not matched then
insert values(np.product_id, np.product_name, np.category)
個人覺得這個功能沒有太大的意義,我們的insert into本身就支援這樣的功能,沒有必要使用merge
4. UPDATE子句後面可以跟DELETE子句來去除一些不需要的行
delete只能和update配合,從而達到刪除滿足where條件的子句的紀錄
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name delete where p.product_id = np.product_id where np.product_name like 'OL%'
when not matched then
insert values(np.product_id, np.product_name, np.category)
這裡我們達到的目的就是 會把匹配的記錄的prodcut_name更新到product裡,並且把product_name開頭為OL的刪除掉。
merge into也是一個dml語句,和其他的dml語句一樣需要透過rollback和commit 結束事務。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29519108/viewspace-1331694/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Sqlserver、oracle中Merge的使用方法,一個merge語句搞定多個Insert,Update,Delete操作SQLServerOracledelete
- oracle中的條件語句Oracle
- ORACLE常用語句:Oracle
- Oracle執行語句跟蹤 使用sql trace實現語句追蹤OracleSQL
- Oracle基本SQL語句OracleSQL
- Oracle 建立序列語句Oracle
- Sqlserver的merge into或delete語句堵塞select語句,鎖型別是LCK_M_ISSQLServerdelete型別
- Oracle中如何查詢未使用繫結變數的SQL語句?Oracle變數SQL
- php中return語句的使用PHP
- MySQL中explain語句的使用MySqlAI
- ORACLE 資料庫 查詢語句與DML語句Oracle資料庫
- 【SQL】Oracle SQL join on語句and和where使用區別SQLOracle
- Oracle select 語句字串拼接小例項-quote使用Oracle字串
- SQL查詢語句 (Oracle)SQLOracle
- Oracle中獲取TABLE的DDL語句的方法Oracle
- 被oracle搞死的部分語句(持續更新中)Oracle
- Oracle OCP(01):使用SQL SELECT語句檢索資料OracleSQL
- oracle v$sqlare 分析SQL語句使用資源情況OracleSQL
- 查詢Oracle正在執行的sql語句及執行該語句的使用者OracleSQL
- ORACLE多表關聯UPDATE語句Oracle
- Oracle資料庫語句大全Oracle資料庫
- 列出oracle dbtime得sql語句OracleSQL
- oracle檢視物件DDL語句Oracle物件
- 【LOB】Oracle lob管理常用語句Oracle
- oracle語句練習--初級Oracle
- oracle資料庫常用語句Oracle資料庫
- ORACLE中sql語句----運算子的優先順序OracleSQL
- Oracle獲取資料庫中的物件建立語句Oracle資料庫物件
- php中條件語句的使用整理PHP
- python中try..except語句如何使用?Python
- MogDB/openGauss中merge的語法解析
- ORACLE結構化查詢語句Oracle
- 後臺執行SQL語句(oracle)SQLOracle
- Oracle SQL精妙SQL語句講解OracleSQL
- lightdb -- merge into insert 相容 OracleOracle
- 使用withopen語句(未完)
- 找到Oracle資料庫中效能最差的查詢語句BSOracle資料庫
- c語言中,while(1)語句使用break語句跳出迴圈C語言While
- oracle-資料庫- insert 插入語句Oracle資料庫