<?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>OS与Oracle &#187; Oracle SQL 扩展</title>
	<atom:link href="http://www.os2ora.com/category/oracle-sql-extension/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.os2ora.com</link>
	<description>专注于现实世界Oracle数据库的高性能，高可扩展性与新一代数据库Exadata架构</description>
	<lastBuildDate>Mon, 19 Sep 2011 09:10:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>物化视图，索引，数据仓库</title>
		<link>http://www.os2ora.com/materialized-view-index-data-warehousing/</link>
		<comments>http://www.os2ora.com/materialized-view-index-data-warehousing/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 06:04:57 +0000</pubDate>
		<dc:creator>Kaya</dc:creator>
				<category><![CDATA[Oracle SQL 扩展]]></category>
		<category><![CDATA[数据库性能调优]]></category>
		<category><![CDATA[Ad-Hoc]]></category>
		<category><![CDATA[DSS]]></category>
		<category><![CDATA[Exadata]]></category>
		<category><![CDATA[Index]]></category>
		<category><![CDATA[Materialized View]]></category>
		<category><![CDATA[OLAP]]></category>
		<category><![CDATA[Query Rewrite]]></category>

		<guid isPermaLink="false">http://www.os2ora.com/materialized-view-index-data-warehousing/</guid>
		<description><![CDATA[Materialized Views, 其实不是View。我觉得把它归类于Index可能还准确一些。
View在我们的印象里总是逻辑存在的。即使前面加上一个Materialized，我们只会觉得奇怪，干嘛要对View进行物化呢？
把它理解为一种特殊的Index未尝不可，况且，它与Index有一些相同点：
They consume storage space.
They must be refreshed when the data in their master tables changes.
They improve the performance of SQL execution when they are used for query rewrites.
Their existence is transparent to SQL applications and users.......]]></description>
			<content:encoded><![CDATA[<p>Kaya 发表于 <a href="http://www.os2ora.com">os2ora.com</a></p>
<p>Materialized Views, 其实不是View。我觉得把它归类于Index可能还准确一些。</p>
<p>View在我们的印象里总是逻辑存在的。即使前面加上一个Materialized，我们只会觉得奇怪，干嘛要对View进行物化呢？</p>
<p>把它理解为一种特殊的Index未尝不可，况且，它与Index有一些相同点：</p>
<ul>
<li>They consume storage space.</li>
<li>They must be refreshed when the data in their master tables changes.</li>
<li>They improve the performance of SQL execution when they are used for <strong><em>query rewrites</em></strong>.</li>
<li>Their existence is transparent to SQL applications and users.</li>
</ul>
<p>而一般的View呢？</p>
<ul>
<li>They <em>don’t </em>consume storage space.</li>
<li>They <em>don’t</em> need to be refreshed when the data in their master tables changes.</li>
<li>They <em>don’t </em>improve the performance of SQL execution, database just maps the View to the underlying Table when executing.</li>
<li>Their existence is transparent to SQL applications and users.</li>
</ul>
<p>不过，Materialized View为什么特殊，我觉得在于它的应用场合——数据仓库。或许我们可以说，Materialized View 是专门用于数据仓库的Index。</p>
<p>问题在于，数据仓库场合和OLTP场合对Index的要求有哪些不同，干嘛需要一个专门的Materialized View？</p>
<p>数据仓库的查询一般都是”大”查询。何谓大？多表联合（n个大表join在一起），多维度分析（一长串的group by），聚合统计（avg, count, sum,rank,cube）。</p>
<p>数据库如何跑这种查询呢？硬件方面，用更多的CPU和硬盘；软件方面，采用数据分区，并行执行。软硬件一起提供的厂商，如Oracle的Exadata, Teradata, Netezza, 可能做到数据库软件与硬件的紧密结合，从而实现对数据的智能扫描（在IO这一层实现对不需要数据的过滤）等技术。</p>
<p>这种做法可以很好地应对数据仓库里一类重要的查询：随机查询。例如，某位领导突然想到了一个决策方案，开发人员必须为这种决策提供分析数据。</p>
<p>另一方面，如果某类“大”查询经常被执行，我们就得想办法对其进行优化了。最直接的方法就是缓存中间结果，多表连接的结果，多维度分析的结果，聚合统计的结果，对了，这就是Materialized View的用武之地了。</p>
<p>Materialized View缓存了中间结果，Oracle通过Query Rewrite的技术把对基表的访问转换成对Materialized View的访问。这个对性能的提高可以是成千上万倍的。</p>
<p>如何创建Materialized View以便让Query Rewrite用到，这也许是Materialized View里面最重要的部分，也是理解Query Rewrite如何工作的一个途径。最好的参考文献当然是Oracle的<strong><a href="http://download.oracle.com/docs/cd/B28359_01/server.111/b28313/qradv.htm">Oracle® Database Data Warehousing Guide</a>.</strong></p>
<p>以后的文章再回来看看Query Rewrite的实现。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.os2ora.com/materialized-view-index-data-warehousing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>connect by的性能分析</title>
		<link>http://www.os2ora.com/connect-by-performance-tunning/</link>
		<comments>http://www.os2ora.com/connect-by-performance-tunning/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 11:52:03 +0000</pubDate>
		<dc:creator>Kaya</dc:creator>
				<category><![CDATA[Oracle SQL 扩展]]></category>
		<category><![CDATA[数据库性能调优]]></category>
		<category><![CDATA[connect by]]></category>
		<category><![CDATA[distinct]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[tree]]></category>

		<guid isPermaLink="false">http://www.os2ora.com/connect-by-performance-tunning/</guid>
		<description><![CDATA[对上一篇文章里提到两条语句 
select distinct begin_date, end_date, begin_date + level -1 day  from test connect by begin_date + level -1 <= end_date order by 1,2,3; 
和 
select one_date 
  from (select start_date + level - 1 one_date 
          from (select min(start_date) start_date, max(end_date) end_date 
                  from test) test 
        connect by start_date + level - 1 < = end_date ) all_date, 
       test 
where one_date between start_date and end_date; 

它们都实现相同的功能，即: 当一个表里面有两个列，分别为begin_date和end_date时，如何针对这个表的每一行，用SQL返回begin_date和end_date之间的所有连续日期。 

这两条语句的可扩展性问题是下面是讨论的重点......]]></description>
			<content:encoded><![CDATA[<p>Kaya 发表于 <a href="http://www.os2ora.com">os2ora.com</a></p>
<p>对上一篇文章里提到两条语句<br />
select distinct begin_date, end_date, begin_date + level -1 day  from test connect by begin_date + level -1 &lt;= end_date order by 1,2,3;<br />
和<br />
select one_date<br />
  from (select start_date + level &#8211; 1 one_date<br />
          from (select min(start_date) start_date, max(end_date) end_date<br />
                  from test) test<br />
        connect by start_date + level &#8211; 1 &lt; = end_date ) all_date,<br />
       test<br />
where one_date between start_date and end_date;</p>
<p>它们都实现相同的功能，即: 当一个表里面有两个列，分别为begin_date和end_date时，如何针对这个表的每一行，用SQL返回begin_date和end_date之间的所有连续日期。</p>
<p>首先，我们关注第一条语句在没有distinct的情况下返回的行数。</p>
<p>会使问题简单化，假设对于表里的每行数据，end_date &#8211; begin_date + 1 的值都是一样的，设为 n 。假设test里总共有 m 行(m&gt;1)。<br />
那么，这时返回的行数是 m * ( power(m,n) &#8211; 1 )/( m &#8211; 1 ) 。<br />
(<br />
这是一个等比数列，公式为<br />
1 +  m +  power(m,2) + &#8230;.  power(m,n-1) = ( 1 &#8211; power (m,n)) / (1 &#8211; m),<br />
)<br />
这些行可以用一系列的树加以形象的表示，如下所示：</p>
<p><a href="http://www.os2ora.com/wp-content/uploads/2009/03/connectby.jpg"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="connectby" src="http://www.os2ora.com/wp-content/uploads/2009/03/connectby-thumb.jpg" border="0" alt="connectby" width="627" height="181" /></a></p>
<p>当 n 和 m 很大时，会使结果集变得非常之大，为 power(m,n).</p>
<p>因此，下面语句在数据量变大的情况下，性能将急剧下降!<br />
select distinct begin_date, end_date, begin_date + level -1 day  from test connect by begin_date + level -1 &lt;= end_date order by 1,2,3;</p>
<p>对于语句2，我们关注以下子查询所返回的行数:<br />
select start_date + level &#8211; 1 one_date<br />
          from (select min(start_date) start_date, max(end_date) end_date<br />
                  from test) test<br />
        connect by start_date + level &#8211; 1 &lt; = end_date</p>
<p>这时，表实质上只有1行时，存贮的是原来表的最大值和最小值。也就是说，这时 m = 1 。</p>
<p>当m=1时，情况变得不同了。这时，返回的行数刚好就是 n 。<br />
如果以树加以表示的话，这时上面的图形已经退化成一棵只有一个支干的树。</p>
<p><a href="http://www.os2ora.com/wp-content/uploads/2009/03/image4.png"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="image" src="http://www.os2ora.com/wp-content/uploads/2009/03/image-thumb4.png" border="0" alt="image" width="251" height="184" /></a></p>
<p>因此，当原来的查询m 和 n都很大时，返回的行数为 将为n。</p>
<p>从上面的表述可清晰地看出，语句2在大数据量的情形下将能体现出良好的性能。</p>
<p>从另一方面看，出现distinct的地方，或许就是性能调整应该关注的地方了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.os2ora.com/connect-by-performance-tunning/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>如何用SQL返回两个日期之间的所有连续日期</title>
		<link>http://www.os2ora.com/how-to-return-continuous-dates-between-two-dates/</link>
		<comments>http://www.os2ora.com/how-to-return-continuous-dates-between-two-dates/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 11:43:02 +0000</pubDate>
		<dc:creator>Kaya</dc:creator>
				<category><![CDATA[Oracle SQL 扩展]]></category>
		<category><![CDATA[connect by]]></category>
		<category><![CDATA[Hierarchical Queries]]></category>

		<guid isPermaLink="false">http://www.os2ora.com/%e5%a6%82%e4%bd%95%e7%94%a8sql%e8%bf%94%e5%9b%9e%e4%b8%a4%e4%b8%aa%e6%97%a5%e6%9c%9f%e4%b9%8b%e9%97%b4%e7%9a%84%e6%89%80%e6%9c%89%e8%bf%9e%e7%bb%ad%e6%97%a5%e6%9c%9f/</guid>
		<description><![CDATA[举个例子，假设有两个日期 2009-03-20和2009-03-23，如果用SQL返回2009-03-20, 2009-03-21, 2009-03-22, 2009-03-23。 更一般的，当一个表里面有两个列，分别为begin_date和end_date时，如何针对这个表的每一行，用SQL返回begin_date和end_date之间的所有连续日期......]]></description>
			<content:encoded><![CDATA[<p>Kaya 发表于 <a href="http://www.os2ora.com">os2ora.com</a></p>
<p>举个例子，假设有两个日期 2009-03-20和2009-03-23，如果用SQL返回2009-03-20, 2009-03-21, 2009-03-22, 2009-03-23。<br />
更一般的，当一个表里面有两个列，分别为begin_date和end_date时，如何针对这个表的每一行，用SQL返回begin_date和end_date之间的所有连续日期。</p>
<p>在层次查询中，Oracle引入了一个伪列level,用来表示当前行（节点）对应的level，它从1开始计数，每多一层level的值就加1。我们可以据此实现对两个日期/整数之间所有日期/整数的遍历。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">SQL&amp;gt; <span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> test <span style="color: #66cc66;">&#40;</span>begin_date date<span style="color: #66cc66;">,</span>end_date date<span style="color: #66cc66;">&#41;</span>;
SQL&amp;gt; <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> test <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span>trunc<span style="color: #66cc66;">&#40;</span>sysdate<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> trunc<span style="color: #66cc66;">&#40;</span>sysdate<span style="color: #66cc66;">+</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
SQL&amp;gt; <span style="color: #993333; font-weight: bold;">SELECT</span> begin_date<span style="color: #66cc66;">,</span> end_date<span style="color: #66cc66;">,</span> begin_date <span style="color: #66cc66;">+</span> level <span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span> day <span style="color: #993333; font-weight: bold;">FROM</span> test connect <span style="color: #993333; font-weight: bold;">BY</span> begin_date <span style="color: #66cc66;">+</span> level <span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span> &amp;lt;<span style="color: #66cc66;">=</span> end_date;
BEGIN_DAT END_DATE  DAY
<span style="color: #808080; font-style: italic;">--------- --------- ---------</span>
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">24</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">25</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">26</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
&nbsp;
<span style="color: #cc66cc;">6</span> rows selected<span style="color: #66cc66;">.</span></pre></div></div>

<p>当test表里面有多行时，这个方法还行得通吗？</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">SQL&amp;gt; <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> test <span style="color: #993333; font-weight: bold;">VALUES</span><span style="color: #66cc66;">&#40;</span>trunc<span style="color: #66cc66;">&#40;</span>sysdate<span style="color: #66cc66;">+</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>trunc<span style="color: #66cc66;">&#40;</span>sysdate<span style="color: #66cc66;">+</span><span style="color: #cc66cc;">7</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
SQL&amp;gt; <span style="color: #993333; font-weight: bold;">SELECT</span>  begin_date<span style="color: #66cc66;">,</span> end_date<span style="color: #66cc66;">,</span> begin_date <span style="color: #66cc66;">+</span> level <span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span> day  <span style="color: #993333; font-weight: bold;">FROM</span> test connect <span style="color: #993333; font-weight: bold;">BY</span> begin_date <span style="color: #66cc66;">+</span> level <span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span> &amp;lt;<span style="color: #66cc66;">=</span> end_date <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">3</span>;
&nbsp;
BEGIN_DAT END_DATE  DAY
<span style="color: #808080; font-style: italic;">--------- --------- ---------</span>
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">24</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">24</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">25</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">25</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">25</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">25</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">26</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">26</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">26</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">26</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">26</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">26</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">26</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">26</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">29</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">29</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">29</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">29</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
&nbsp;
<span style="color: #cc66cc;">62</span> rows selected<span style="color: #66cc66;">.</span></pre></div></div>

<p>或许应该加上一个distinct</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">SQL&amp;gt; <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #993333; font-weight: bold;">DISTINCT</span> begin_date<span style="color: #66cc66;">,</span> end_date<span style="color: #66cc66;">,</span> begin_date <span style="color: #66cc66;">+</span> level <span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span> day  <span style="color: #993333; font-weight: bold;">FROM</span> test connect <span style="color: #993333; font-weight: bold;">BY</span> begin_date <span style="color: #66cc66;">+</span> level <span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span> &amp;lt;<span style="color: #66cc66;">=</span> end_date <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">3</span>;
&nbsp;
BEGIN_DAT END_DATE  DAY
<span style="color: #808080; font-style: italic;">--------- --------- ---------</span>
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">24</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">25</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">26</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">23</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">28</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">29</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
<span style="color: #cc66cc;">27</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">30</span><span style="color: #66cc66;">-</span>MAR<span style="color: #66cc66;">-</span>09
&nbsp;
<span style="color: #cc66cc;">10</span> rows selected<span style="color: #66cc66;">.</span>
&nbsp;
SQL&amp;gt;</pre></div></div>

<p>另外一种方法是先得到min(begin_date) 和 max(end_date)之间所有的连续日期，假设这些日期放在表all_date里面，再用表all_date和原来的表test做连接，从而得到最后的结果。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> one_date
  <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> start_date <span style="color: #66cc66;">+</span> level <span style="color: #66cc66;">-</span> <span style="color: #cc66cc;">1</span> one_date
          <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> min<span style="color: #66cc66;">&#40;</span>start_date<span style="color: #66cc66;">&#41;</span> start_date<span style="color: #66cc66;">,</span> max<span style="color: #66cc66;">&#40;</span>end_date<span style="color: #66cc66;">&#41;</span> end_date
                  <span style="color: #993333; font-weight: bold;">FROM</span> test<span style="color: #66cc66;">&#41;</span> test
        connect <span style="color: #993333; font-weight: bold;">BY</span> start_date <span style="color: #66cc66;">+</span> level <span style="color: #66cc66;">-</span> <span style="color: #cc66cc;">1</span> &amp;lt; <span style="color: #66cc66;">=</span> end_date <span style="color: #66cc66;">&#41;</span> all_date<span style="color: #66cc66;">,</span>
       test
 <span style="color: #993333; font-weight: bold;">WHERE</span> one_date <span style="color: #993333; font-weight: bold;">BETWEEN</span> start_date <span style="color: #993333; font-weight: bold;">AND</span> end_date;</pre></div></div>

<p>下篇文章探讨下两种方式的性能。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.os2ora.com/how-to-return-continuous-dates-between-two-dates/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>如何实现组织结构中的汇总统计</title>
		<link>http://www.os2ora.com/how-to-hierarchical-summary/</link>
		<comments>http://www.os2ora.com/how-to-hierarchical-summary/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 11:20:32 +0000</pubDate>
		<dc:creator>Kaya</dc:creator>
				<category><![CDATA[Oracle SQL 扩展]]></category>
		<category><![CDATA[connect by]]></category>
		<category><![CDATA[connect_by_root]]></category>
		<category><![CDATA[group by]]></category>
		<category><![CDATA[Hierarchical Queries]]></category>
		<category><![CDATA[salary]]></category>
		<category><![CDATA[summary]]></category>

		<guid isPermaLink="false">http://www.os2ora.com/how-to-hierarchical-summary/</guid>
		<description><![CDATA[汇总统计是数据处理中常见的一个操作。对于一般的数据模型来说，一般是有一个事实表，若干个维度表，通过事实表与维度表的连接，实现不同层次的查询汇总。 
问题是对于组织结构而言，一般所有的数据都存贮于一个表中，而且，组织结构的层次也是动态的。那么，在这种情况下，如何实现员工工资的汇总呢？一个比较有趣的问题是: 如何统计员工及其所有被管理员工的总工资，举个例子，CEO的总工资就是整个公司总有员工的总工资之和，包括他自己......]]></description>
			<content:encoded><![CDATA[<p>Kaya 发表于 <a href="http://www.os2ora.com">os2ora.com</a></p>
<p>汇总统计是数据处理中常见的一个操作。对于一般的数据模型来说，一般是有一个事实表，若干个维度表，通过事实表与维度表的连接，实现不同层次的查询汇总。<br />
问题是对于组织结构而言，一般所有的数据都存贮于一个表中，而且，组织结构的层次也是动态的。那么，在这种情况下，如何实现员工工资的汇总呢？一个比较有趣的问题是: 如何统计员工及其所有被管理员工的总工资，举个例子，CEO的总工资就是整个公司总有员工的总工资之和，包括他自己。</p>
<p>Oracle 引入了一个扩展的运算符，专门用来处理此种情形，它就是connect_by_root。<br />
当以connect_by_root修饰一个列名时，Oracle将返回根节点对应的此列的值。例如，当start with 为 last_name = &#8216;King&#8217;时，这时返回的所有行的connect_by_root last_name的值都将为&#8217;King&#8217;。这时，对所有行的累计就是对&#8217;King&#8217;的数据的累计了。当不指定start with 子句时，Oracle将对每个节点依次进行遍历，于是，我们可以对返回的结果对last_name进行一次group by，那么我们就得到了所有last_name对应的汇总工资了。</p>
<p>下面是Oracle 文档中的例子。<br />
The following example returns the last name of each employee in department 110, each manager above that employee in the hierarchy, the number of levels between manager and employee, and the path between the two:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> last_name <span style="color: #ff0000;">&quot;Employee&quot;</span><span style="color: #66cc66;">,</span> CONNECT_BY_ROOT last_name <span style="color: #ff0000;">&quot;Manager&quot;</span><span style="color: #66cc66;">,</span>
   LEVEL<span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span> <span style="color: #ff0000;">&quot;Pathlen&quot;</span><span style="color: #66cc66;">,</span> SYS_CONNECT_BY_PATH<span style="color: #66cc66;">&#40;</span>last_name<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'/'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;Path&quot;</span>
   <span style="color: #993333; font-weight: bold;">FROM</span> employees
   <span style="color: #993333; font-weight: bold;">WHERE</span> LEVEL &amp;gt; <span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">AND</span> department_id <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">110</span>
   CONNECT <span style="color: #993333; font-weight: bold;">BY</span> PRIOR employee_id <span style="color: #66cc66;">=</span> manager_id
   <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #ff0000;">&quot;Employee&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;Manager&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;Pathlen&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;Path&quot;</span>;
&nbsp;
Employee        Manager            Pathlen Path
<span style="color: #808080; font-style: italic;">--------------- --------------- ---------- ------------------------------</span>
Gietz           Higgins                  <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">/</span>Higgins<span style="color: #66cc66;">/</span>Gietz
Gietz           King                     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">/</span>King<span style="color: #66cc66;">/</span>Kochhar<span style="color: #66cc66;">/</span>Higgins<span style="color: #66cc66;">/</span>Gietz
Gietz           Kochhar                  <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">/</span>Kochhar<span style="color: #66cc66;">/</span>Higgins<span style="color: #66cc66;">/</span>Gietz
Higgins         King                     <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">/</span>King<span style="color: #66cc66;">/</span>Kochhar<span style="color: #66cc66;">/</span>Higgins
Higgins         Kochhar                  <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">/</span>Kochhar<span style="color: #66cc66;">/</span>Higgins</pre></div></div>

<p>The following example uses a GROUP BY clause to return the total salary of each employee in department 110 and all employees below that employee in the hierarchy:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> name<span style="color: #66cc66;">,</span> SUM<span style="color: #66cc66;">&#40;</span>salary<span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;Total_Salary&quot;</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#40;</span>
   <span style="color: #993333; font-weight: bold;">SELECT</span> CONNECT_BY_ROOT last_name <span style="color: #993333; font-weight: bold;">AS</span> name<span style="color: #66cc66;">,</span> Salary
      <span style="color: #993333; font-weight: bold;">FROM</span> employees
      <span style="color: #993333; font-weight: bold;">WHERE</span> department_id <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">110</span>
      CONNECT <span style="color: #993333; font-weight: bold;">BY</span> PRIOR employee_id <span style="color: #66cc66;">=</span> manager_id<span style="color: #66cc66;">&#41;</span>
      <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">BY</span> name
   <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> name<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;Total_Salary&quot;</span>;
&nbsp;
NAME                      Total_Salary
<span style="color: #808080; font-style: italic;">------------------------- ------------</span>
Gietz                             <span style="color: #cc66cc;">8300</span>
Higgins                          <span style="color: #cc66cc;">20300</span>
King                             <span style="color: #cc66cc;">20300</span>
Kochhar                          <span style="color: #cc66cc;">20300</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.os2ora.com/how-to-hierarchical-summary/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Oracle的层次结构化查询 &#8212; 基础篇</title>
		<link>http://www.os2ora.com/hierarchical-queries-basic/</link>
		<comments>http://www.os2ora.com/hierarchical-queries-basic/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 09:50:41 +0000</pubDate>
		<dc:creator>Kaya</dc:creator>
				<category><![CDATA[Oracle SQL 扩展]]></category>
		<category><![CDATA[connect by]]></category>
		<category><![CDATA[connect_by_root]]></category>
		<category><![CDATA[Hierarchical Queries]]></category>
		<category><![CDATA[prior]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[start with]]></category>
		<category><![CDATA[tree]]></category>

		<guid isPermaLink="false">http://www.os2ora.com/hierarchical-queries-basic/</guid>
		<description><![CDATA[虽然Oracle不是一个层次型的数据库，不过它却对层次型应有不错的支持。
层次型应用最常见的是一个公司内部的组织结构。
在计算机科学中，或者更具体地说，在数据结构中，层次型结构是由“树”来描述的。节点之间的关系代表着上下两个层次之间节点的关系，即父子关系。这一般是一对多的关系。
一般地，我们会把这一系列的父子关系存贮到数据库里的一个表里面。
而Oracle的任务，就是要重现这棵树，并实现有关层次关系的运算......]]></description>
			<content:encoded><![CDATA[<p>Kaya 发表于 <a href="http://www.os2ora.com">os2ora.com</a></p>
<p>虽然Oracle不是一个层次型的数据库，不过它却对层次型应有不错的支持。</p>
<p>层次型应用最常见的是一个公司内部的组织结构。</p>
<p>在计算机科学中，或者更具体地说，在数据结构中，层次型结构是由“树”来描述的。节点之间的关系代表着上下两个层次之间节点的关系，即父子关系。这一般是一对多的关系。</p>
<p>一般地，我们会把这一系列的父子关系存贮到数据库里的一个表里面。</p>
<p>而Oracle的任务，就是要重现这棵树，并实现有关层次关系的运算。例如，打印出层次结构图，统计层次结构中每个节点对应的直接子节点数，对应的直接子节点和间接子节点数，统计每个节点的所处的层次。</p>
<p>以公司内部组织结构为例，则要求实现对公司组织结构的重现，统计每位经理所直接管理员工的数目，直接和间接管理员工的数目，每位经理所处的级别，还有，每位经理所管理的所有员工的总有工资的总和，等等。</p>
<p>为了实现这些功能，Oracle引入了几个关键词，connect by, prior 和 start with。connect by实现了表中两个直接层次间数据行的连接，而prior则是用来标记哪个是父节点。start with则代表从哪些节点开始遍历。如下图所示:</p>
<p><a href="http://www.os2ora.com/wp-content/uploads/2009/03/image.png"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="image" src="http://www.os2ora.com/wp-content/uploads/2009/03/image-thumb.png" border="0" alt="image" width="479" height="231" /></a></p>
<p>下面是Oracle如何处理connect by 和prior的官方描述<br />
Oracle processes hierarchical queries as follows:<br />
    * A join, if present, is evaluated first, whether the join is specified in the FROM clause or with WHERE clause predicates.<br />
    * The CONNECT BY condition is evaluated.<br />
    * Any remaining WHERE clause predicates are evaluated.</p>
<p>更详细地:<br />
   1. Oracle selects the root row(s) of the hierarchy—those rows that satisfy the START WITH condition.<br />
   2. Oracle selects the child rows of each root row (from all the rows in the table). Each child row must satisfy the condition of the CONNECT BY condition with respect to one of the root rows.<br />
   3. Oracle selects successive generations of child rows. Oracle first selects the children of the rows returned in step 2, and then the children of those children, and so on. Oracle always selects children by evaluating the CONNECT BY condition with respect to a current parent row.<br />
   4. If the query contains a WHERE clause without a join, then Oracle eliminates all rows from the hierarchy that do not satisfy the condition of the WHERE clause. Oracle evaluates this condition for each row individually, rather than removing all the children of a row that does not satisfy the condition.<br />
   5. Oracle returns the rows in the order shown in Figure 9-1. In the diagram, children appear below their parents.</p>
<p>Figure 9-1 Hierarchical Queries</p>
<p><a href="http://www.os2ora.com/wp-content/uploads/2009/03/image1.png"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="image" src="http://www.os2ora.com/wp-content/uploads/2009/03/image-thumb1.png" border="0" alt="image" width="262" height="204" /></a></p>
<p>关于第5点，这就是大家熟悉的树的中序遍历算法。而前面的4点，应该说是一个层次遍历。我想我们更应该记住的是第5点，谁知道Oracle内部具体实现时是不是按照前4点的描述呢。</p>
<p>以上面这个图为例子。我们可以利用Oracle的查询语句打印出类似目录树的输出。做为对基础知识的一个实践。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> hierarchy <span style="color: #66cc66;">&#40;</span>id number<span style="color: #66cc66;">,</span> parent_id number<span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> hierarchy<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> hierarchy<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> hierarchy<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">7</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> hierarchy<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">9</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> hierarchy<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> hierarchy<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> hierarchy<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">8</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">7</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> hierarchy<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">9</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> hierarchy<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">9</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> hierarchy<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> hierarchy<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> hierarchy<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span>;
col tree format a10
col path format a15
<span style="color: #993333; font-weight: bold;">SELECT</span> level<span style="color: #66cc66;">,</span>rpad<span style="color: #66cc66;">&#40;</span>’<span style="color: #66cc66;">-</span><span style="color: #ff0000;">',level,’-'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span> id tree<span style="color: #66cc66;">,</span> sys_connect_by_path<span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">,</span>’<span style="color: #66cc66;">/</span><span style="color: #ff0000;">') Path, connect_by_root id
from hierarchy
start with parent_id is null
connect by parent_id = prior id;</span></pre></div></div>

<p>输出如下所示:</p>
<p><a href="http://www.os2ora.com/wp-content/uploads/2009/03/image2.png"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="image" src="http://www.os2ora.com/wp-content/uploads/2009/03/image-thumb2.png" border="0" alt="image" width="804" height="343" /></a></p>
<p>connect by 和connect_by_root 还有许多有趣的扩展应用。后继文章再详细探讨一下。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.os2ora.com/hierarchical-queries-basic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

