merge语句使用_使用SQL:2003 MERGE语句的奥术魔术

merge语句使用

时不时地,由于以下任何原因,我们不得不将INSERT与UPDATE区分开来感到尴尬:
  • 我们必须至少发表两个声明
  • 我们必须考虑性能
  • 我们必须考虑比赛条件
  • 我们必须在[UPDATE; 如果UPDATE_COUNT = 0 THEN INSERT]和[INSERT; 如果例外然后更新]
  • 我们必须对每个更新/插入的记录执行一次这些语句

总而言之,这是错误和挫败感的重要根源。 同时,使用SQL MERGE语句可能是如此简单!

MERGE的典型情况

在许多其他用例中,当处理多对多关系时,MERGE语句可能会派上用场。 假设我们有以下架构:

CREATE TABLE documents (id NUMBER(7) NOT NULL,CONSTRAINT docu_id PRIMARY KEY (id));CREATE TABLE persons (id NUMBER(7) NOT NULL,CONSTRAINT pers_id PRIMARY KEY (id));CREATE TABLE document_person (docu_id NUMBER(7) NOT NULL,pers_id NUMBER(7) NOT NULL,flag NUMBER(1) NULL,CONSTRAINT docu_pers_pk PRIMARY KEY (docu_id, pers_id),CONSTRAINT docu_pers_fk_docu FOREIGN KEY (docu_id) REFERENCES documents(id),CONSTRAINT docu_pers_fk_pers FOREIGN KEY (pers_id) REFERENCES persons(id));

上表用于建模哪个人已阅读(flag = 1)/已删除(flag = 2)哪个文档。 为简单起见,通常将“ document_person”实体与“ documents”外部联接,以便“ document-person”记录的存在或不存在可能具有相同的语义:“ flag IS NULL”表示未读文档。
现在,当您要将文档标记为已读时,必须决定是插入一个新的“ document_person”,还是更新现有的“ document_person”。 与删除相同。 与将所有文档标记为已读或删除所有文档相同。

改用MERGE

您可以一口气做到这一切! 假设您要插入/更新一条记录,以将一个文档标记为已读:

-- The target tableMERGE INTO document_person dst-- The data source. In this case, just a dummy recordUSING (SELECT :docu_id as docu_id, :pers_id as pers_id, :flag    as flagFROM DUAL) src-- The merge condition (if true, then update, else insert)ON (dst.docu_id = src.docu_id AND dst.pers_id = src.pers_id)-- The update actionWHEN MATCHED THEN UPDATE SETdst.flag = src.flag-- The insert actionWHEN NOT MATCHED THEN INSERT (dst.docu_id,dst.pers_id,dst.flag)VALUES (src.docu_id,src.pers_id,src.flag)

这看起来很相似,但是比MySQL的INSERT .. ON DUPLICATE KEY UPDATE语句冗长得多,这更加简洁。

发挥到极致

但是,您可以走得更远! 如前所述,您可能还希望将给定人员的所有文档标记为已读。 合并没问题。 如果指定:docu_id,则以下语句与上一条相同。 如果将其保留为空,它将仅将所有文档标记为:flag:

MERGE INTO document_person dst-- The data source is now all "documents" (or just :docu_id) left outer-- joined with the "document_person" mappingUSING (SELECT d.id     as docu_id, :pers_id as pers_id, :flag    as flagFROM documents dLEFT OUTER JOIN document_person d_p ON d.id = d_p.docu_id AND d_p.pers_id = :pers_id-- If :docu_id is set, select only that documentWHERE (:docu_id IS NOT NULL AND d.id = :docu_id)-- Otherwise, select all documentsOR (:docu_id IS NULL)) src-- If the mapping already exists, update. Else, insertON (dst.docu_id = src.docu_id AND dst.pers_id = src.pers_id)-- The rest stays the sameWHEN MATCHED THEN UPDATE SETdst.flag = src.flagWHEN NOT MATCHED THEN INSERT (dst.docu_id,dst.pers_id,dst.flag)VALUES (src.docu_id,src.pers_id,src.flag)

jOOQ中的MERGE支持

jOOQ也完全支持MERGE。 有关更多详细信息,请参见手册(滚动至底部):
http://www.jooq.org/manual/JOOQ/Query/
合并愉快! :-)

参考:我们的JCG合作伙伴 Lukas Eder在JAVA,SQL和JOOQ博客上使用SQL:2003 MERGE语句 编写了 Arcane magic 。

相关文章 :

  • Java中的数据库架构导航
  • ORM问题
  • SQL或NOSQL:这是问题吗?
  • 什么是NoSQL?
  • 按汇总分组/多维数据集

翻译自: https://www.javacodegeeks.com/2011/12/arcane-magic-with-sql2003-merge.html

merge语句使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UVA 10917 Walk Through the Forest

最短路DP Walk Through the ForestTime Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu[Submit] [Go Back] [Status] Description Problem C: A Walk Through the Forest Jimmy experiences a lot of stress at work these days, especially sin…

python定义区间[-5、5_有一个数 x 在区间 [-5,0] 内 , 写出其条件表达式 。 (5.0分)_学小易找答案...

【其它】2018应心ABC反应时任务实验数据.sav 请利用上面的实验数据文档,完成本次实验的报告撰写,并上传。 【单选题】“ab”+”c”*2 结果是: (3.0分) 【判断题】元组可以作为集合的元素。 (2.0分) 【判断题】函数中必须包含return语句。 (3.5分) 【判断题】加法运算符可以用来…

java实现愤怒的小鸟游戏

导读:Java语言是一门面向对象的编程语言,它不但汲取了C++语言的各种精髓,而且还抛弃了C++语言里晦涩难懂的多继承和指针等概念,所以Java语言具有的特征便是:功能超强和易用实用。 Jbox2D中不仅集成了大量物理运动学和机械运动学计算,而且也将物理仿真包集成到

为什么应始终将连接池与Oracle XE一起使用

介绍 Oracle Express Edition是Oracle Enterprise Edition的免费版本,其较小的尺寸使其非常方便地测试各种Oracle功能。 根据Oracle文档 ,Express Edition最多可以使用一个CPU和1 GB RAM,但是实际上存在其他限制并不总是很明显。 数据库连接…

异想维度 java_Java实现多字段(维度)复杂排序

//Java 实现多字段排序HashMap map1 new HashMap();map1.put("dataindex0", null);map1.put("dataindex1", 6);map1.put("dataindex2", 1.1);map1.put("id", 1);HashMap map2 new HashMap();map2.put("dataindex0", "…

Linux下mysql的root密码忘记解决方法

方法一: 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以任意地登录和修改MySQL的信息…

一文教你用java实现愤怒的小鸟游戏

导读:Java语言是一门面向对象的编程语言,它不但汲取了C语言的各种精髓,而且还抛弃了C语言里晦涩难懂的多继承和指针等概念,所以Java语言具有的特征便是:功能超强和易用实用。Jbox2D中不仅集成了大量物理运动学和机械运…

java中大数开方_大数开方(Java版)

Java代码:适合被开方数不超过1000位的。import java.util.*;import java.math.*;public class Main{public static void main(String[] args){Scanner cinnew Scanner(System.in);int tcin.nextInt();BigInteger remainBigInteger.ZERO;BigInteger oddBigInteger.ZE…

WinForm - 两个窗体之间的方法调用

方法1: 所有权法//Form1://需要有一个公共的刷新方法public void Refresh_Method(){  //...} //在调用Form2时,要把Form2的所有者设为Form1Form2 f2 new Form2() ;f2.Owner this;f2.ShowDialog() ; //Form2://在需要对其调用者&#xff0…

一文教你用java实现儿时的超级玛丽游戏

导读:近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用。J2SE称为Java标准版或Java标准平台。J2SE提供了标准的SDK开发平台。利用该平台可以开发Java桌面应用程序和低端的服务器应用程序…

'mysql_attr_use_buffered_query'_php中mysql操作的buffer知识

php与mysql的连接有三种方式,mysql,mysqli,pdo。不管使用哪种方式进行连接,都有使用buffer和不使用buffer的区别。什么叫使用buffer和不使用buffer呢?客户端与mysql服务端进行查询操作,查询操作的时候如果获…

java开发一款雷电游戏

导读:电脑游戏,是指在计算机上能够运转的游戏软件。这种软件具有较强的娱乐性。电脑游戏的创新和发展与硬件、软件的发展紧密相关。它能够给玩家提供一个虚拟的环境,使游戏带给了人们很多的享受和欢乐。雷电游戏因为操作简单,节奏明快,一直是纵轴射击游戏的经典之作。经常…

glassfish_具有GlassFish和一致性的高性能JPA –第2部分

glassfish在我的四部分系列的第二部分中,我将解释将Coherence与EclipseLink和GlassFish结合使用的第一个策略。它描述了配置带有Coherence的JPA支持的Cache所必须采取的步骤,以及如何在GlassFish中使用它。高性能数据存储。 一般的做法 您可以将Coherenc…

java开发一个连连看小游戏

导读:连连看是一种消除类益智游戏,核心要求是在规定的时间内,消除游戏界面中选中的两张相同的图案,直至完全消除所有图案。这款游戏操作简单(只需单击鼠标左键操作)、面向人群广泛,在限时操作的游戏要求下,吸引玩家自发地锻炼观察能力、判断能力和反应能力,故从推出至今…

将java.util.concurrent.BlockingQueue用作rx.Observable

在Java中,经典的生产者-消费者模式相对简单,因为我们有java.util.concurrent.BlockingQueue 。 为了避免繁忙的等待和容易出错的手动锁定,我们只需利用put()和take() 。 如果队列已满或为空,它们都将阻塞。 我们需要的…

Mac OS X 10.10如何打开虚拟内存

转载请注明出处:http://www.cnblogs.com/blazer/p/5103608.html 禁用虚拟内存sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist删除交换文件sudo rm /private/var/vm/swapfile*启用虚拟内存sudo launchctl load -w /System/L…

java 1.5.0 gcj_CentOS安装JAVA后JAVA版本不对的问题

今天用CentOS安装JDK,发觉在安装完成后,输入java命令来验证是否安装成功时,出现Usage: gij [OPTION] ... CLASS [ARGS] ...to invoke CLASS.main, orgij -jar [OPTION] ... JARFILE [ARGS] ...to execute a jar fileTry gij --help‘ for mor…

java开发一款模拟写字板系统

导读:目前,很多新的技术领域都涉及到了Java语言,Java语言是面向对象编程,并且涉及到网络、多线程等重要的基础知识,因此Java语言也是学习面向对象编程和网络编程的首选语言。此简易JAVA写字板程序,使用Java程序编写,能够进行输入文字操作,并具有新建文件,打开文件,保…

java枚举的特点_Java中有些好的特性(二):枚举

前言我在写上一篇时,开始选了一个很土的名字“Java超过C#的地方”,然后引起了某些同学的不满,后来修改了个名。我在这里再次申明一下,我没有贬低任何语言之意,纯粹是从一个.NET程序员的角度去看Java,看看是…

java开发一款推箱子游戏

导读:社会在进步,人们生活质量也在日益提高。高强度的压力也接踵而来。社会中急需出现新的有效方式来缓解人们的压力。此次设计符合了社会需求,Java推箱子游戏可以让人们在闲暇之余,体验游戏的乐趣。具有操作简单,易于上手的特点。 推箱子游戏的玩法十分简单——控制人物绕…