Merge into的使用详解

Merge是一个非常有用的功能,类似于Mysql里的insert into on duplicate key.

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%’

这里注意比较一下,他们返回的结果行数,是有着差异的。

  1. 在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

  1. 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 结束事务。

Merge是一个非常强大的功能,而且是我们需求里经常会用到的一个有用的功能,所以我们一定要好好的学习到。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Eclipse Git用户指南 目录 1 Getting Started 1.1 Overview 1.2 Basic Tutorial: Adding a project to version control 1.2.1 Configuration 1.2.1.1 Identifying yourself 1.2.1.2 Setting up the Home Directory on Windows 1.2.1.3 Pointing out the System wide configuration 1.2.2 Create Repository 1.2.3 Track Changes 1.2.4 Inspect History 1.3 GitHub Tutorial 1.3.1 Create Local Repository 1.3.2 Create Repository at GitHub 1.3.3 Eclipse SSH Configuration 1.3.4 Push Upstream 1.4 EclipseCon 2012 Git Tutorial 2 Concepts 2.1 Repository 2.2 Index 2.3 Branches 2.3.1 Local Branches 2.3.2 Remote Tracking Branches 2.4 Working Directory 2.5 Recording Changes in the Repository 3 Tasks 3.1 Creating Repositories 3.1.1 Considerations for Git Repositories to be used in Eclipse 3.1.1.1 The short story 3.1.1.2 The longer story 3.1.1.2.1 Eclipse Workspace and Repository working directory 3.1.1.2.2 Implications 3.1.2 Creating a new empty Git Repository 3.1.3 Creating a Git Repository for multiple Projects 3.2 Starting from existing Git Repositories 3.2.1 Starting the import wizard 3.2.2 Cloning or adding Repositories 3.2.2.1 Cloning a Repository 3.2.2.2 Adding a Repository 3.2.3 Selecting a Repository from the List 3.2.4 Importing projects 3.2.5 Wizard for project import 3.2.5.1 Import Existing Projects 3.2.5.1.1 Limiting the Scope for Project Import 3.2.5.2 Use the New Projects Wizard 3.2.5.3 Import as General Project 3.3 Working with remote Repositories 3.3.1 Cloning Remote Repositories 3.3.1.1 Repository Selection 3.3.1.2 Branch Selection 3.3.1.3 Local Destination 3.3.1.4 Cloning from specific locations 3.3.2 Pushing to other Repositories 3.3.2.1 Pushing to upstream 3.3.2.1.1 Configuring upstream push 3.3.2.2 Direct Push 3.3.2.3 Push Wizard 3.3.2.3.1 Push URI 3.3.2.3.2 Push Ref Specifications 3.3.2.3.3 Delete Ref Specifications 3.3.2.3.4 Conflicting Push Ref Specifications 3.3.2.3.5 Push Confirmation 3.3.2.3.6 Push Result Report 3.3.3 Fetching from other Repositories 3.3.3.1 Fetching from upstream 3.3.3.1.1 Configuring fetch from upstream 3.3.3.2 Direct Fetch 3.3.3.3 Fetch Wizard 3.3.3.3.1 Fetch Ref Specifications 3.3.3.3.2 Fetch Result Report 3.3.4 Pulling New Changes from Upstream Branch 3.4 Working with Gerrit 3.4.1 Enabling Gerrit for a repository 3.4.2 Pushing a change to a Gerrit Code Review Server 3.4.3 Fetching a change from a Gerrit Code Review Server 3.5 Inspecting the state of the Repository 3.5.1 Label Decorations 3.5.1.1 Text Decorations 3.5.1.2 Icon Decorations 3.5.2 Commit Dialog 3.5.3 Comparing Content 3.5.3.1 Compare editor and Synchronize View 3.5.3.2 Compare working tree with last commit 3.5.3.3 Comparing Working Tree with Index 3.5.3.4 Comparing Working Tree with a branch, a tag or a reference 3.5.3.5 Comparing Working Tree with Any Commit 3.5.3.5.1 From the project explorer: 3.5.3.5.2 From the history view (files only): 3.5.3.6 Comparing Two Commits 3.5.3.7 Comparing Index with HEAD or Any Other Commit 3.5.4 Comparing with Branches (Synchronize) 3.5.5 Quickdiff 3.5.6 Inspecting Commits 3.5.6.1 View Diff for a Commit 3.5.6.2 Showing the contents of a Commit 3.6 Committing Changes 3.6.1 Modifying the content 3.6.2 Committing 3.6.2.1 Committing with the Staging View 3.6.2.2 Committing using Commit Dialog 3.6.2.3 Commit Message 3.6.2.4 Amending Commits 3.7 Reverting Changes 3.7.1 Reverting changes in the working tree 3.7.1.1 Replace with File in Git Index 3.7.1.2 Replace with HEAD 3.7.1.3 Replace with Branch, Tag or Reference 3.7.1.4 Replace with Commit 3.7.1.5 Replace with Previous Revision 3.7.2 Revert using quickdiff 3.7.3 Reverting changes introduced by a specific commit 3.7.4 Resetting your current HEAD 3.7.4.1 Reset to specific branch or tag 3.7.4.2 Reset to a specific commit 3.7.4.3 Revert all local and staged changes 3.8 Branching 3.8.1 General remarks about branches 3.8.1.1 Upstream configuration 3.8.2 Checking out an existing Branch 3.8.2.1 From the team menu on a project node: 3.8.2.2 From the Git Repositories View 3.8.2.3 From the History View 3.8.3 Creating a New Local Branch 3.8.3.1 From the team menu 3.8.3.2 From the Repositories View 3.8.3.3 From the History View 3.8.4 Renaming an Existing Branch 3.8.4.1 From the Team menu on a Project node 3.8.4.2 From the Repositories View 3.8.4.3 From the History View 3.8.5 Deleting a Branch 3.8.5.1 From the Team Menu on a Project node 3.8.5.2 From the Repositories View 3.8.5.3 From the History View 3.8.6 Branch Creation Dialog 3.8.7 Configure Branch Dialog 3.9 Merging 3.9.1 Merging a branch or a tag into the current branch 3.9.1.1 Starting merge from the History View 3.9.1.2 Starting merge from the Team menu 3.9.1.3 Starting merge from the Git Repositories View 3.9.1.4 Merge options 3.9.1.5 Possible merge results 3.9.1.5.1 Merge Result dialog 3.9.2 Resolving a merge conflict 3.9.2.1 Using Merge Tool 3.9.2.2 Manual conflict resolution 3.9.2.3 Finding conflicting files 3.9.2.4 Editing conflicting files 3.9.2.5 Adding conflict resolution to the git index 3.9.2.6 Committing a merge 3.9.3 Aborting Merge 3.10 Rebasing 3.10.1 Rebase Introduction 3.10.2 Rebase, A Simple Example 3.10.3 The Real World: Rebase Conflicts 3.10.4 Starting Rebase 3.10.5 Rebase Confirmation Dialog 3.10.6 Rebase Conflicts 3.10.7 Aborting Rebase 3.11 Interactive Rebase 3.11.1 Synopsis 3.11.2 Starting interactive rebase 3.11.3 Planning rebase 3.11.4 Executing interactive rebase 3.11.5 Safety Instructions 3.11.6 Rebase with auto-stashing 3.12 Cherry Picking 3.12.1 Cherry-pick Introduction 3.12.2 Cherry-pick Example 3.13 Tagging 3.13.1 Creating a Tag 3.13.2 Replacing an Existing Tag 3.13.3 Deletion of tags 3.13.4 Light-weight and Signed Tags 3.14 Patches 3.14.1 Creating Patches 3.14.1.1 Create a Patch from a Commit 3.14.1.2 Patch Wizard 3.14.2 Applying Patches 3.15 Managing Repositories 3.15.1 Adding Repositories to the Git Repositories View 3.15.1.1 Adding a Repository manually 3.15.1.2 Cloning a Repository 3.15.1.3 Creating a Repository 3.15.1.4 Adding a Repository using Copy and Paste 3.15.2 Removing Repositories 3.15.2.1 Removing a Repository from the Repositories View 3.15.2.2 Deleting a Repository 3.15.3 Structure of the Git Repositories View 3.15.4 Functions of the Git Repositories View 3.15.4.1 Project Import 3.15.4.2 Branch and Tag Support 3.15.4.2.1 Check-out of Branches and Tags 3.15.4.2.2 Creation and Deletion of Branches 3.15.4.2.3 Rebasing 3.15.4.2.4 Merging a Branch or a Tag 3.15.4.2.5 Synchronizing with a Branch or a Tag 3.15.4.2.6 Determining the Checked-out Branch 3.15.4.2.7 Resetting to a Branch or a Tag 3.15.4.2.8 "Detached" HEAD 3.15.4.3 Inspecting References 3.15.4.4 Browsing the Working Directory 3.15.4.5 Repository Configuration 3.15.4.6 Remote Repositories 3.15.4.6.1 Direct Fetch and Push Support 3.15.4.6.2 Adding a Remote Configuration 3.15.4.6.3 Changing Remote Configurations 3.15.4.6.4 Gerrit Configuration 3.15.5 Refresh 3.15.6 Link with Selection 3.15.7 Link with Editor 3.15.8 Hierarchical Branch Layout 3.15.9 Bare Repositories 3.15.10 Removing Repositories from the Git Repositories View 3.15.11 Showing Repository in Related Views 3.15.11.1 Show in History 3.15.11.2 Show in Reflog 3.15.11.3 Show in Properties 3.16 Working with Tasks 3.16.1 Installation 3.16.2 Commit Message Template 3.17 Viewing Commits 3.17.1 Tagging a commit 3.17.2 Creating a branch from a commit 3.17.3 Checking out a commit 3.17.4 Cherry picking a commit 3.17.5 Opening the commit viewer 3.18 Searching for commits 3.18.1 Git Search page 3.18.2 Browsing Search Results 3.18.3 Launching Git Search 3.18.4 Open commit dialog 3.19 Finding the author of each line in a file 3.20 Working with Submodules 3.20.1 Cloning Repositories with Submodules 3.20.2 Browsing Submodules 3.20.3 Adding a Submodule 3.20.4 Updating Submodules 3.21 Team Project Sets 3.21.1 Import 3.21.2 Export 3.21.3 Format 4 Reference 4.1 Menus 4.1.1 Project Context Menu 4.1.2 Resource Context Menu 4.1.3 Repositories View Menus 4.1.4 History View Menus 4.1.5 Git Workbench Toolbar and Git Workbench Menu 4.1.6 Menu Actions 4.2 Git Perspective and Views 4.2.1 Git Perspective 4.2.2 Git Repositories View 4.2.3 History View 4.2.3.1 Overview 4.2.3.2 Opening the History View 4.2.3.3 Organization of the History View 4.2.3.4 Using the History View 4.2.3.4.1 Inspecting the Commit Graph 4.2.3.4.2 Displaying and Comparing versions of a File 4.2.3.4.3 Working with the Filter Settings 4.2.3.5 Toolbar actions 4.2.3.5.1 Find 4.2.3.5.2 Filter settings 4.2.3.5.3 Compare Mode 4.2.3.5.4 All Branches 4.2.3.6 View Menu actions 4.2.3.6.1 Configuring the View 4.2.3.7 Context Menu actions 4.2.3.7.1 Compare with working tree 4.2.3.7.2 Compare with each other 4.2.3.7.3 Open 4.2.3.7.4 Checkout 4.2.3.7.5 Create Branch... 4.2.3.7.6 Delete Branch 4.2.3.7.7 Create Tag... 4.2.3.7.8 Create Patch... 4.2.3.7.9 Cherry Pick 4.2.3.7.10 Revert Commit 4.2.3.7.11 Merge 4.2.3.7.12 Rebase on top of 4.2.3.7.13 Reset > Soft/Mixed/Hard 4.2.3.7.14 Quickdiff > Reset Quickdiff Basline to HEAD 4.2.3.7.15 Quickdiff > Reset Quickdiff Basline to first parent of HEAD 4.2.3.7.16 Quickdiff > Set as Baseline 4.2.3.7.17 Copy 4.2.3.7.18 Show Revision Comment 4.2.3.7.19 Show Revision Details 4.2.3.7.20 Wrap Comments 4.2.3.7.21 Fill Paragraphs 4.2.3.8 Drag and Drop Support 4.2.3.9 Working with the Revision Details Area 4.2.4 Synchronize View 4.2.4.1 Synchronization State 4.2.4.2 Mode 4.2.4.3 Models 4.2.4.4 Navigation 4.2.5 Git Tree Compare View 4.2.6 Git Staging View 4.2.6.1 Partial Staging 4.2.7 Git Reflog View 4.3 Git URLs 4.4 Git References 4.5 Refspecs 4.5.1 Push Refspecs 4.5.2 Fetch Refspecs 4.6 Remotes 4.7 Git Ignore 4.8 Git Fetch Factory for PDE Build

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值