设为首页 收藏本站
查看: 1001|回复: 0

[经验分享] Merge Sql

[复制链接]

尚未签到

发表于 2016-11-7 04:27:02 | 显示全部楼层 |阅读模式
  我们经常遇到的一个需求是,先判断数据是否存在,如果存在则更新,否则就插入,以前比较土是用java自己做了。这个在多线程或者多机的情况下就会有些问题,有时候还得让db报个唯一性约束才行。
  
  最近和一个同事(以前是oracle的)做项目,发现他写了个牛逼的sql(或者说自己见识太短浅了),特此膜拜下
  
  类似这样的
  

MERGE INTO test1 a
USING all_objects b
ON (a.object_id = b.object_id)
WHEN MATCHED THEN
UPDATE SET a.status = b.status
WHERE  b.status != 'VALID'
WHEN NOT MATCHED THEN
INSERT (object_id, status)
VALUES (b.object_id, b.status)
WHERE  b.status != 'VALID';

   查了些资料发现这种merge sql早就被支持了,只是自己还不知道而已。
  
  <--------------------------------------不华丽的分界线--------------------------------------------------------------------->
  
  例如wiki上的  http://en.wikipedia.org/wiki/Merge_%28SQL%29
  

Merge (SQL)

From Wikipedia, the free encyclopedia

Jump to: navigation
,
search



DSC0000.png


It has been suggested that Upsert

be merged
into this article or section. (Discuss
)
  A relational database management system
uses SQL
MERGE
(upsert
) statements to INSERT

new records or UPDATE

existing records depending on whether or not a condition
matches. It was officially introduced in the SQL:2008
standard.


Contents

[hide
]




  • 1
    Usage

  • 2
    Other non-standard implementations

  • 3
    References

  • 4
    External links


 
Usage


MERGE INTO table_name
USING table_reference
ON (condition
)
WHEN MATCHED THEN
UPDATE SET column1
= value1
[, column2
= value2
...]
WHEN NOT MATCHED THEN
INSERT (column1
[, column2
...]) VALUES (value1
[, value2 ...



Other non-standard implementations

  Some other database management systems support this, or very similar behavior, through their own, non-standard SQL extensions.
  MySQL
, for example, supports the use of INSERT ... ON DUPLICATE KEY UPDATE
syntax[
1]

which can be used to achieve the same effect. It also supports REPLACE INTO
syntax[
2]

, which first deletes the row, if exists, and then inserts the new one.
  SQLite
's INSERT OR REPLACE INTO
works similarly.
  Firebird
supports both MERGE INTO
and a single-row version, UPDATE OR INSERT INTO tablename (columns) VALUES (values) [MATCHING (columns)]
,
but the latter does not give you the option to take different actions
on insert vs. update (e.g. setting a new sequence value only for new
rows, not for existing ones.)

 
References




  • ^

    MySQL :: MySQL 5.1 Reference Manual :: 12.2.4.3 INSERT ... ON DUPLICATE KEY UPDATE Syntax

  • ^

    MySQL 5.1 Reference Manual: 11.2.6 REPLACE Syntax

 
External links




  • HyperSQL (HSQLDB) documentation

  • Oracle 11g Release 2 documentation
    on MERGE


  • Firebird 2.1 documentation
    on MERGE


  • DB2 v9 MERGE statement

  • SQL Server 2008 documentation

  • H2 (1.2) SQL Syntax page
  
  <---------------------------------------------不华丽的分界线--------------------------------------------------------------->
  同时也找了
  http://www.oracle-base.com/articles/10g/MergeEnhancements10g.php
  

MERGE Statement Enhancements in Oracle Database 10g
  
Oracle 10g includes a number of amendments to the MERGE
statement making it more flexible.



  • Test Table

  • Optional Clauses

  • Conditional Operations

  • DELETE Clause

Test Table
  
The following examples use the table defined below.


CREATE TABLE test1 AS
SELECT *
FROM   all_objects
WHERE  1=2;

Optional Clauses
  
The MATCHED
and NOT MATCHED
clauses are now optional making all of the following examples valid.


-- Both clauses present.
MERGE INTO test1 a
USING all_objects b
ON (a.object_id = b.object_id)
WHEN MATCHED THEN
UPDATE SET a.status = b.status
WHEN NOT MATCHED THEN
INSERT (object_id, status)
VALUES (b.object_id, b.status);
-- No matched clause, insert only.
MERGE INTO test1 a
USING all_objects b
ON (a.object_id = b.object_id)
WHEN NOT MATCHED THEN
INSERT (object_id, status)
VALUES (b.object_id, b.status);
-- No not-matched clause, update only.
MERGE INTO test1 a
USING all_objects b
ON (a.object_id = b.object_id)
WHEN MATCHED THEN
UPDATE SET a.status = b.status;

Conditional Operations
  
Conditional inserts and updates are now possible by using a WHERE
clause on these statements.


-- Both clauses present.
MERGE INTO test1 a
USING all_objects b
ON (a.object_id = b.object_id)
WHEN MATCHED THEN
UPDATE SET a.status = b.status
WHERE  b.status != 'VALID'
WHEN NOT MATCHED THEN
INSERT (object_id, status)
VALUES (b.object_id, b.status)
WHERE  b.status != 'VALID';
-- No matched clause, insert only.
MERGE INTO test1 a
USING all_objects b
ON (a.object_id = b.object_id)
WHEN NOT MATCHED THEN
INSERT (object_id, status)
VALUES (b.object_id, b.status)
WHERE  b.status != 'VALID';
-- No not-matched clause, update only.
MERGE INTO test1 a
USING all_objects b
ON (a.object_id = b.object_id)
WHEN MATCHED THEN
UPDATE SET a.status = b.status
WHERE  b.status != 'VALID';

DELETE Clause
  
An optional DELETE WHERE
clause can be used to clean up after a merge operation. Only those rows which match both the ON
clause and the
DELETE WHERE
clause are deleted.


MERGE INTO test1 a
USING all_objects b
ON (a.object_id = b.object_id)
WHEN MATCHED THEN
UPDATE SET a.status = b.status
WHERE  b.status != 'VALID'
DELETE WHERE (b.status = 'VALID');
  
For further information see:



  • MERGE

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-296617-1-1.html 上篇帖子: SQL server 2000企业版的安装,需要注意的地方 下篇帖子: Project_Server安装(转)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表