<?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>Read ERN &#187; sys_connect_by_path</title>
	<atom:link href="http://www.readern.com/tag/sys_connect_by_path/feed" rel="self" type="application/rss+xml" />
	<link>http://www.readern.com</link>
	<description>生命不息折腾不止</description>
	<lastBuildDate>Sat, 31 Dec 2011 16:18:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>[重发]分组连接列字符串方法</title>
		<link>http://www.readern.com/oracle-group-by-connect-string.html</link>
		<comments>http://www.readern.com/oracle-group-by-connect-string.html#comments</comments>
		<pubDate>Tue, 08 Sep 2009 13:53:19 +0000</pubDate>
		<dc:creator>ern</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[sys_connect_by_path]]></category>

		<guid isPermaLink="false">http://www.readern.com/?p=135</guid>
		<description><![CDATA[又翻了一把，顺便转自己文章一篇过来。原文发表于2007年6月20日 共享一个Oracle技巧吧。在以前一篇blog里我写过自定义聚集函数——一条语句将多行的列中字符串连接起来，技术总是在进步的。在这一期的Oracle Magazine中的AskTom，学到了一个不错的方法。从8i开始Oracle增加了分析函数，从9iR1开始，又有了SYS_CONNECT_BY_PATH函数，于是，产生了下面一个更加简单的方法。 CREATE TABLE test AS SELECT rownum office, chr(ascii(&#8216;a&#8217;) + rownum &#8211; 1) staff FROM all_objects WHERE rownum &#60; 10; INSERT INTO test SELECT rownum, chr(ascii(&#8216;o&#8217;) + rownum &#8211; 1) FROM all_objects WHERE rownum &#60; 10; SELECT * FROM test; 1 a 2 b 3 c 4 d 5 e 6 f 7 [...]]]></description>
			<content:encoded><![CDATA[<p>又翻了一把，顺便转自己文章一篇过来。原文发表于<a href="http://yaoyp.spaces.live.com/blog/cns!AC5FD97B8A549660!1057.entry" target="_blank">2007年6月20日</a><br />
共享一个Oracle技巧吧。在以前一篇blog里我写过<a href="http://yaoyp.spaces.live.com/blog/cns!AC5FD97B8A549660!497.entry" target="_blank">自定义聚集函数——一条语句将多行的列中字符串连接起来</a>，技术总是在进步的。在<a href="http://www.oracle.com/technology/oramag/oracle/07-jul/o47asktom.html" target="_blank">这一期的Oracle Magazine中的AskTom</a>，学到了一个不错的方法。从8i开始Oracle增加了分析函数，从9iR1开始，又有了SYS_CONNECT_BY_PATH函数，于是，产生了下面一个更加简单的方法。</p>
<p><span id="more-135"></span></p>
<p>CREATE TABLE test AS</p>
<p>SELECT rownum office, chr(ascii(&#8216;a&#8217;) + rownum &#8211; 1) staff</p>
<p>FROM all_objects</p>
<p>WHERE rownum &lt; 10;</p>
<p>INSERT INTO test</p>
<p>SELECT rownum, chr(ascii(&#8216;o&#8217;) + rownum &#8211; 1)</p>
<p>FROM all_objects</p>
<p>WHERE rownum &lt; 10;</p>
<p>SELECT * FROM test;</p>
<p>1 a</p>
<p>2 b</p>
<p>3 c</p>
<p>4 d</p>
<p>5 e</p>
<p>6 f</p>
<p>7 g</p>
<p>8 h</p>
<p>9 i</p>
<p>1 o</p>
<p>2 p</p>
<p>3 q</p>
<p>4 r</p>
<p>5 s</p>
<p>6 t</p>
<p>7 u</p>
<p>8 v</p>
<p>9 w</p>
<p>SELECT office, ltrim(MAX(sys_connect_by_path(staff, &#8216;,&#8217;)), &#8216;,&#8217;) namelist</p>
<p>FROM (SELECT office,</p>
<p>staff,</p>
<p>row_number() over(PARTITION BY office ORDER BY staff) rn</p>
<p>FROM test) v</p>
<p>START WITH rn = 1</p>
<p>CONNECT BY PRIOR rn = rn &#8211; 1</p>
<p>AND PRIOR office = office</p>
<p>GROUP BY office</p>
<p>ORDER BY office;</p>
<p>1 a,o</p>
<p>2 b,p</p>
<p>3 c,q</p>
<p>4 d,r</p>
<p>5 e,s</p>
<p>6 f,t</p>
<p>7 g,u</p>
<p>8 h,v</p>
<p>9 i,w<br />
其实原理并不复杂，就是通过ROW_NUMBER()函数实现分组编号，然后根据编号递增来分组连接，将SYS_CONNECT_BY_PATH函数第二个参数以及外面的LTRIM参数替换成你需要的符号就可以了。不过注意两点哦，一个，这个方法只有在Oracle9iR1之后才能用；第二，如果你想用空（”）连接，那不能直接在SYS_CONNECT_BY_PATH里用空（”）作为参数，而要用其他字符然后在外面用REPLACE替换，否则就可能遇到ORA-30003错误，即SYS_CONNECT_BY_PATH的参数非法。<br />
有了这个法子，原来那个复杂的方法基本可以抛弃咯^_^</p>
<hr />
<p><small>© ern for <a href="http://www.readern.com">Read ERN</a>, 2009. |
<a href="http://www.readern.com/oracle-group-by-connect-string.html">Permalink</a> |
<a href="http://www.readern.com/oracle-group-by-connect-string.html#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.readern.com/oracle-group-by-connect-string.html&title=[重发]分组连接列字符串方法">del.icio.us</a>
<br/>
Post tags: <a href="http://www.readern.com/tag/oracle" rel="tag">Oracle</a>, <a href="http://www.readern.com/tag/sys_connect_by_path" rel="tag">sys_connect_by_path</a><br/>
</small></p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.readern.com/oracle-group-by-connect-string.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

