<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sybase数据库技术，数据库恢复专家 &#187; merge</title>
	<atom:link href="http://www.dbainfo.net/tag/merge/feed" rel="self" type="application/rss+xml" />
	<link>https://www.dbainfo.net</link>
	<description>提供Sybase ASE及Sybase SQL Anywhere数据库修复服务，电话：13811580958(微信)，QQ：289965371！We have many years of experience in recovering data from damanged Sybase devices. Contact us by Phone: +86 13811580958 Wechat: 13811580958 Email: 289965371@qq.com</description>
	<lastBuildDate>Sat, 14 Jun 2025 16:28:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Sybase ASE V15.7新版本中将支持MERGE语句</title>
		<link>https://www.dbainfo.net/sybase-ase-v15-7-first-support-merge-sql-command.htm</link>
		<comments>https://www.dbainfo.net/sybase-ase-v15-7-first-support-merge-sql-command.htm#comments</comments>
		<pubDate>Mon, 18 Jul 2011 02:41:57 +0000</pubDate>
		<dc:creator>dbainfo</dc:creator>
				<category><![CDATA[Sybase ASE]]></category>
		<category><![CDATA[ASE V15.7]]></category>
		<category><![CDATA[merge]]></category>

		<guid isPermaLink="false">http://www.dbainfo.net/?p=921</guid>
		<description><![CDATA[2011年9月，Sybase公司将发布ASE的下一个版本V15.7。当前ASE最新版本为V15.5，版本号V15.6将被跳过，原因和从V15.0直接跳到V15.5或V12.5升到V15.0比较相似吧？有时候必须这么做。 即将推出的Sybase ASE V15.7中增加了很多的新特性。本博客将着重介绍其中一个比较实用的特性：MERGE命令。 ANSI- SQL2003标准中首次提到了MERGE这个命令，简单理解为：&#8221;向目标表中插入不存在的记录，更新已经存在的数据&#8220;。其它数据库管理系统，比如 Oracle在9i中就引入了MERGE命令，Sybase SQL Anywhere中也有该命令。迄今为止，Sybase ASE中只能使用类似的if update else insert的方法来实现MERGE的功能。 下面是一个使用MERGE的例子。表Customers中存储客户信息，每周需要将表Cust_updates_week_10中的数据更新到客户表Customers中。为了简化起见，本例子只更新address和number这2个字段。 merge into Customers as c&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; using Cust_updates_week_10 as u&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; on c.CustID = u.CustID&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; when not matched then&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160; insert (CustID,Addr,Phone) values(u.CustID,u.Addr,u.Phone) when matched then&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160; update set Addr=u.Addr, Phone=u.Phone&#160;&#160;&#160; 让我们来分析一下上面的这个SQL语句。 第1行merge into Customers as c表示Customers为目的表。 第2行using Cust_updates_week_10 as u表示Cust_updates_week_10为源数据表，被插入或更新的内容将来源于此表。 第3行指定数据行是否存在的条件，本例子为演示起见，仅指定了一个条件。on c.CustID [...]]]></description>
			<content:encoded><![CDATA[<p>2011年9月，Sybase公司将发布ASE的下一个版本V15.7。当前ASE最新版本为V15.5，版本号V15.6将被跳过，原因和从V15.0直接跳到V15.5或V12.5升到V15.0比较相似吧？有时候必须这么做。</p>
<p>即将推出的Sybase ASE V15.7中增加了很多的新特性。本博客将着重介绍其中一个比较实用的特性：MERGE命令。</p>
<p>ANSI- SQL2003标准中首次提到了MERGE这个命令，简单理解为：&rdquo;向目标表中插入不存在的记录，更新已经存在的数据&ldquo;。其它数据库管理系统，比如 Oracle在9i中就引入了MERGE命令，Sybase SQL Anywhere中也有该命令。迄今为止，Sybase ASE中只能使用类似的if update else insert的方法来实现MERGE的功能。</p>
<p>下面是一个使用MERGE的例子。表Customers中存储客户信息，每周需要将表Cust_updates_week_10中的数据更新到客户表Customers中。为了简化起见，本例子只更新address和number这2个字段。<span id="more-921"></span></p>
<blockquote>
<p>merge into Customers as c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
		using Cust_updates_week_10 as u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
		on c.CustID = u.CustID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
		when not matched then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
		&nbsp;&nbsp;&nbsp;&nbsp; insert (CustID,Addr,Phone) values(u.CustID,u.Addr,u.Phone)<br />
		when matched then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
		&nbsp;&nbsp;&nbsp;&nbsp; update set Addr=u.Addr, Phone=u.Phone&nbsp;&nbsp;&nbsp;</p>
</blockquote>
<p>让我们来分析一下上面的这个SQL语句。</p>
<ul>
<li>第1行merge into Customers as c表示Customers为目的表。</li>
<li>第2行using Cust_updates_week_10 as u表示Cust_updates_week_10为源数据表，被插入或更新的内容将来源于此表。</li>
<li>第3行指定数据行是否存在的条件，本例子为演示起见，仅指定了一个条件。on c.CustID = u.CustID将使得ASE语法解释器对Customers和Cust_updates_week_10做左外连接处理。</li>
<li>第4-5行表示Cust_updates_week_10包含的并且在Customers中不存在的数据，也就是&ldquo;新客户&rdquo;数据，将被插入到表Customers中。</li>
<li>第6行表示两张表中的记录匹配时，&ldquo;非键&rdquo;列可以被更新。本例子仅更新address和phone两个字段。</li>
</ul>
<p>我们可以拓展MERGE命令的语法，比如：可以使用多个&ldquo;当存在时&rdquo;、&ldquo;当不存在时&rdquo;这样的语句。下面的例子将使用两个&ldquo;when matched&rdquo;语句，第一个&ldquo;when matched&rdquo;语句判断存在的记录中address字段是否为空，当address为空，记录将被删除。</p>
<blockquote>
<p>merge into Customers as c<br />
		using Cust_updates_week_10 as u<br />
		on c.CustID = u.CustID<br />
		when not matched then<br />
		&nbsp; insert (CustID,Addr,Phone) values(u.CustID,u.Addr,u.Phone)<br />
		when matched and u.Addr = NULL then<br />
		&nbsp; delete<br />
		when matched then<br />
		&nbsp; update set Addr=u.Addr, Phone=u.Phone</p>
</blockquote>
<p>
	注意：语句&ldquo;when matched&rdquo;和&ldquo;when not matched&rdquo;的顺序会影响处理的结果。上面的SQL语句中，第一条语句的条件被完全满足时，后面的类似&ldquo;when [not] matched&rdquo;语句就不会被执行了。</p>
<p>MERGE 命令比较实用的地方在于它将比较复杂的多条语句集成到单条SQL语句中。不仅仅使得SQL语句更加简洁、清晰，还能显著得提高执行效率。使用MERGE命 令仅需访问一次源数据表的内容，然后直接处理匹配的每条记录。如果你使用单独的insert、update、delete语句来实现类似的功能时，那么将 至少访问三次源数据表的内容。</p>
<p>MERGE命令比较灵活些，除了使用基表外，还可以使用派生表。</p>
<blockquote>
<p>merge into Customers as c<br />
		using <strong>(select CustID, Addr, Phone from Cust_updates_week_10<br />
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where Phone is not NULL) as u</strong><br />
		on c.CustID = u.CustID<br />
		when not matched then<br />
		&nbsp; insert (CustID,Addr,Phone) values(u.CustID,u.Addr,u.Phone<br />
		when matched then<br />
		&nbsp; update set Addr=u.Addr, Phone=u.Phone</p>
</blockquote>
<p>MERGE命令有一些限制条件，比如上面的SQL语句中，第3行中的键列（CustID）不能被更新。当然，还有其它的一些限制。让我们期待ASE V15.7版本的发布。</p>
<p>本文来自：http://blogs.sybase.com/database/2011/05/peeking-ahead-to-ase-15-7-the-merge-statement/</p>
<div style="clear: both; margin: 10px 0pt; border: 1px dashed rgb(153, 153, 153); font-size: 12px; padding: 5px 10px;">
<li>本文链接地址：<a href="https://www.dbainfo.net/sybase-ase-v15-7-first-support-merge-sql-command.htm">https://www.dbainfo.net/sybase-ase-v15-7-first-support-merge-sql-command.htm</a>；</li>
<li>本文为dbainfo个人原创，请在尊重作者劳动成果的前提下进行转载；</li>
<li>转载务必注明原始出处 : <a href="https://www.dbainfo.net/">Sybase数据库技术，数据库恢复专家</a>；</li>
<li>对《<a href="https://www.dbainfo.net/sybase-ase-v15-7-first-support-merge-sql-command.htm">Sybase ASE V15.7新版本中将支持MERGE语句</a>》有何疑问或见解，请在本文下方发表；</li>
<li>对网站还有其他问题或建议，请提交在<a href="https://www.dbainfo.net/messages" target="_blank">留言板</a>，谢谢！</li>
</div>
<h2  class="related_post_title">相关文章</h2><ul class="related_post"><li>2014-11-29 -- <a href="https://www.dbainfo.net/ase-15-7-silent-install.htm" title="Sybase ASE 15.7静默方式安装并创建服务器">Sybase ASE 15.7静默方式安装并创建服务器</a> (0)</li><li>2014-10-10 -- <a href="https://www.dbainfo.net/ase-object-name-length-limit.htm" title="ASE对象名称长度限制">ASE对象名称长度限制</a> (0)</li><li>2014-06-09 -- <a href="https://www.dbainfo.net/count_all_tables_rowcount.htm" title="统计用户数据库内所有表的行数">统计用户数据库内所有表的行数</a> (0)</li><li>2014-05-26 -- <a href="https://www.dbainfo.net/isql_client_password_encryption_fails.htm" title="isql登录ASE报Client password encryption fails问题解决">isql登录ASE报Client password encryption fails问题解决</a> (0)</li><li>2013-11-19 -- <a href="https://www.dbainfo.net/showplan_html_format.htm" title="以HTML格式显示ASE查询计划">以HTML格式显示ASE查询计划</a> (0)</li><li>2013-10-15 -- <a href="https://www.dbainfo.net/ase-xml-introduction.htm" title="ASE中xml服务使用方法简介">ASE中xml服务使用方法简介</a> (0)</li><li>2013-09-16 -- <a href="https://www.dbainfo.net/select-random-rows-from-table.htm" title="ASE从表中随机选择数据的三种方法">ASE从表中随机选择数据的三种方法</a> (0)</li><li>2013-09-08 -- <a href="https://www.dbainfo.net/get-current-running-sql.htm" title="查看ASE v15正在执行的SQL语句内容">查看ASE v15正在执行的SQL语句内容</a> (0)</li><li>2013-07-18 -- <a href="https://www.dbainfo.net/create-ase-server-by-manual.htm" title="手动创建ASE服务器">手动创建ASE服务器</a> (0)</li><li>2011-10-19 -- <a href="https://www.dbainfo.net/install-ase15-7-glibc-detected-srvbuildres-free-invalid-pointer.htm" title="安装ASE15.7时出现glibc detected *** srvbuildres: free(): invalid pointer问题的解决">安装ASE15.7时出现glibc detected *** srvbuildres: free(): invalid pointer问题的解决</a> (3)</li></ul>]]></content:encoded>
			<wfw:commentRss>https://www.dbainfo.net/sybase-ase-v15-7-first-support-merge-sql-command.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
