MERGE新特性(UPDATE WHERE,DELETE WHERE,INSERT WHERE)
MERGE語句是Oracle9i新增的語法,用來合併UPDATE和INSERT語句。
通過MERGE語句,根據一張表或子查詢的連線條件對另外一張表進行查詢,連線條件匹配上的進行UPDATE,無法匹配的執行INSERT。這個語法僅需要一次全表掃描就完成了全部工作,執行效率要高於INSERT+UPDATE。
語法為
*************************************************************
MERGE [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
**************************************************************
Oracle 10g中MERGE有如下一些改進:
1、UPDATE或INSERT子句是可選的
2、UPDATE和INSERT子句可以加WHERE子句
3、ON條件中使用常量過濾謂詞來insert所有的行到目標表中,不需要連線源表和目標表
4、UPDATE子句後面可以跟DELETE子句來去除一些不需要的
這裡說一下我自己的理解:
第一點意思是可以在MERGE INTO語法中只寫WHEN MATCHED THEN或者只寫WHEN NOT MATCHED THEN。這裡不再贅述。
第二點意思是我們可以在THEN後的UPDATE或者INSERT語句後面加上WHERE條件,比如有這樣的需求:當A表中的ID在B表中不存在時進行插入。當存在時,A表的NAME不為空時進行更新。這種情況就需要在UPDATE字句後+WHERE條件。
第三點意思是我們可以在ON條件中不進行目標表和USING表的關聯,可以在ON條件中寫如1=1這樣的條件。比如我們有這樣的需求:當isAllAdd引數為false時,進行正常的MERGE INTO。當isAllAdd引數為true時,全部執行插入。我們就可以使用這個新特性,對ON中的條件進行篩選從而達到一條sql即可滿足業務的目的。
第四點意思是我們不止可以在MERGE INTO中進行插入更新,還可以對匹配的資料進行刪除操作。這個點非常重要,個人認為第四點是這次改進中最需要我們學習的一點。比如我們有這樣的需求:A表中有期中學生ID,考試年份、考試成績、期末考試成績四個欄位。我們給期末考試成績做批量刪除功能,當沒有期中考試成績時,刪除該資料。當有期中考試成績時,將期末考試成績置空。傳統寫法將需要刪除的人員的List中的資訊其資料庫進行查詢,看其中的每一條是執行修改還是刪除,在分別呼叫。我們現在只需要
MERGE INTO A
USING (TABLE EMPLOYEE) B
ON (A.EMPLOYEEID = B.EMPLOYEEID AND A.YEAR = B.YEAR)
WHEN MATCHED THEN
UPDATE SET 期中考試成績 = ""
DELETE WHERE 期末考試成績 IS NULL
特別說明:
DELETE字句只能寫在MATCHED情況中,不匹配時無法刪除會報錯。
當DELETE跟在UPDATE字句之後時,DELETE字句是針對UPDATE字句修改後的資料進行過濾的。比如需要刪除所有C欄位="1"的資料,UPDATE字句將所有資料的C欄位都更新為1,那麼會刪除所有資料,而不是原本為1的資料。
相關文章
- ORACLE sql merge into update where條件位置與效能消耗OracleSQL
- php資料庫之mysql(where、orderBy、Update)PHP資料庫MySql
- where are you going ? 反序為:going you are whereGo
- update沒帶where,尋找問題的思路
- MyBatis中的<where>標籤和where子句的區別MyBatis
- swift 中的 whereSwift
- Script form where usedORM
- [pl sql] where current ofSQL
- Where is the SCN number written?
- MySQL where 運算子MySql
- having和where
- ubuntu18 沒有 where 命令 -bash: where: command not foundUbuntu
- truncate和不帶where子句的delete, 以及drop區別delete
- Laravel 的 where or 查詢Laravel
- switch拼接where條件
- MySQL-where 1=1MySql
- numpy.where()函式函式
- SQLite中的WHERE子句SQLite
- SQL Where in list 問題SQL
- Where is the script changePerm.sh
- mysql 的delete from where 子查詢的一些限制MySqldelete
- MySQL UDF 在 in ( subquery where ) bugMySql
- Where the top of the stack is on x86
- Laravel 多 where 並搜尋Laravel
- ABAP 動態where語句
- V$sort_usage, where is the definition?
- thinkphp6----where查詢PHP
- mysql中delete fro mysql.user where XX和drop user的不同MySqldelete
- SQL中where和on的區別SQL
- SQL 優先順序join>whereSQL
- SQL join中on與where區別SQL
- malformed database schema (is_transient) - near "where"ORMDatabase
- MySQL最佳化WHERE子句(轉)MySql
- cannot access local variable where it is not associated with a value
- 翻譯|Where and When to Fetch Data With ReduxRedux
- 詳解MySQL中WHERE子句的用法MySql
- whereRaw 與 where (\DB::raw ()) 的區別
- Doctrine\ORM\QueryBuilder 原始碼解析之 whereORMUI原始碼