﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-leekiang-随笔分类-sql</title><link>http://www.blogjava.net/leekiang/category/22041.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 05 May 2007 22:47:29 GMT</lastBuildDate><pubDate>Sat, 05 May 2007 22:47:29 GMT</pubDate><ttl>60</ttl><item><title>父子表根据id找到所有的子孙id</title><link>http://www.blogjava.net/leekiang/archive/2007/04/28/114418.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sat, 28 Apr 2007 11:46:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2007/04/28/114418.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/114418.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2007/04/28/114418.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/114418.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/114418.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp; 有张表,有两个字段: id,patentid，他们分别记录了这条记录的id,以及父id号,<br>&nbsp;&nbsp;&nbsp;&nbsp; 如何根据最顶层的id找到所有的id,包括子id,孙子id,以及重孙id. </p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 64.56%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 74px; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008080">--</span><span style="COLOR: #008080">用递归查询</span><span style="COLOR: #008080"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000">&nbsp;ID,&nbsp;PARENTID&nbsp;</span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000">&nbsp;tablename&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>Start&nbsp;</span><span style="COLOR: #0000ff">With</span><span style="COLOR: #000000">&nbsp;ID&nbsp;</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">xxx</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>Connect&nbsp;</span><span style="COLOR: #0000ff">By</span><span style="COLOR: #000000">&nbsp;Prior&nbsp;ID&nbsp;</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">&nbsp;ParentId</span></div>
<p>&nbsp;以下转自<a href="http://blog.csdn.net/apicescn/archive/2007/02/16/1510922.aspx">http://blog.csdn.net/apicescn/archive/2007/02/16/1510922.aspx</a></p>
<p>&nbsp; <span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">connect by </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"><font face=宋体>是结构化查询中用到的，其基本语法是：</font></span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'"> <br>select ... from tablename start by cond1 <br>connect by cond2 <br>where cond3; <br></span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"><font face=宋体>简单说来是将一个树状结构存储在一张表里，比如一个表中存在两个字段</font></span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">: <br>id,parentid</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"><font face=宋体>那么通过表示每一条记录的</font></span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">parent</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"><font face=宋体>是谁，就可以形成一个树状结构。</font></span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'"> <br></span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"><font face=宋体>用上述语法的查询可以取得这棵树的所有记录。</font></span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'"> <br></span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"><font face=宋体>其中</font></span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">COND1</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"><font face=宋体>是根结点的限定语句，当然可以放宽限定条件，以取得多个根结点，实际就是多棵树。</font></span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'"> <br>COND2</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"><font face=宋体>是连接条件，其中用</font></span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">PRIOR</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"><font face=宋体>表示上一条记录，比如</font></span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'"> CONNECT BY PRIOR ID=PRAENTID</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"><font face=宋体>就是说上一条记录的</font></span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">ID</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"><font face=宋体>是本条记录的</font></span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'">PRAENTID</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"><font face=宋体>，即本记录的父亲是上一条记录。</font></span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'"> <br>COND3</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"><font face=宋体>是过滤条件，用于对返回的所有记录进行过滤。</font></span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'"> <span lang=EN-US><o:p></o:p></span></span></p>
<span class=javascript><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: Arial; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 20pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt">PRIOR</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt">和</span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt">START WITH</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt">关键字是可选项</span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt"><br>PRIORY</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt">运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系，</span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt">PRIOR<br></span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt">运算符在一侧表示父节点，在另一侧表示子节点，从而确定查找树结构是的顺序是自顶向下还是</span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt"><br></span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt">自底向上。在连接关系中，除了可以使用列名外，还允许使用列表达式。</span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt">START WITH </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt">子句为</span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt"><br></span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt">可选项，用来标识哪个节点作为查找树型结构的根节点。若该子句被省略，则表示所有满足查询</span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt"><br></span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt">条件的行作为根节点。</span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt"><br></span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt">完整的例子如</span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt">SELECT PID,ID,NAME FROM&nbsp;T_WF_ENG_WFKIND START WITH PID =0 CONNECT BY PRIOR&nbsp;ID =&nbsp;PID</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 20pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt"></span><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt"></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 20pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt">以上主要是针对上层对下层的顺向递归查询而使用start with&nbsp;... connect by prior ...这种方式,但有时在需求需要的时候,可能会需要由下层向上层的逆向递归查询,此是语句就有所变化:例如要实现 select * from table where id in ('0','01','0101','0203','0304') ;现在想把0304的上一级03给递归出来,0203的上一级02给递归出来,而01现在已经是存在的,最高层为0.而这张table不仅仅这些数据,但我现在只需要('0','01','0101','0203','0304','02','03')这些数据,此时语句可以这样写SELECT PID,ID,NAME FROM V_WF_WFKIND_TREE WHERE ID IN (SELECT DISTINCT(ID) ID FROM V_WF_WFKIND_TREE CONNECT BY PRIOR&nbsp;PID =&nbsp;ID START WITH ID IN ('0','01','0101','0203','0304')&nbsp;);</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 20pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt">其中START WITH ID IN里面的值也可以替换SELECT 子查询语句.</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 20pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt"></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 20pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align=left><a href="http://topic.csdn.net/t/20050319/17/3864428.html">http://topic.csdn.net/t/20050319/17/3864428.html</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://blog.csdn.net/Bogues/archive/2005/10/28/518590.aspx">http://blog.csdn.net/Bogues/archive/2005/10/28/518590.aspx</a><span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 'Arial','sans-serif'; mso-fareast-font-family: 宋体; mso-font-kerning: 0pt"><font color=#ff0000></font></span></span></span></p>
<img src ="http://www.blogjava.net/leekiang/aggbug/114418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2007-04-28 19:46 <a href="http://www.blogjava.net/leekiang/archive/2007/04/28/114418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取一段时间范围内的日期列表</title><link>http://www.blogjava.net/leekiang/archive/2007/04/27/113964.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Thu, 26 Apr 2007 21:00:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2007/04/27/113964.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/113964.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2007/04/27/113964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/113964.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/113964.html</trackback:ping><description><![CDATA[<span style="COLOR: #0000ff">select</span> <span style="COLOR: #000000">&nbsp;to_date(</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">2007/02/26</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000">,&nbsp;</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">yyyy/mm/dd</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000">)&nbsp;</span> <span style="COLOR: #808080">+</span> <span style="COLOR: #000000">&nbsp;rownum&nbsp;</span> <span style="COLOR: #808080">-</span> <span style="COLOR: #000000">&nbsp;</span> <span style="FONT-WEIGHT: bold; COLOR: #800000">1</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">from</span> <span style="COLOR: #000000">&nbsp;user_objects&nbsp;</span> <span style="COLOR: #0000ff">where</span> <span style="COLOR: #000000">&nbsp;rownum&nbsp;</span> <span style="COLOR: #808080">&lt;=</span> <span style="COLOR: #000000">&nbsp;&nbsp;(to_date(</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">2007/03/01</span><span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000">,&nbsp;</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">yyyy/mm/dd</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000">)</span> <span style="COLOR: #808080">-</span> <span style="COLOR: #000000">to_date(</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">2007/02/26</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000">,&nbsp;</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #ff0000">yyyy/mm/dd</span> <span style="COLOR: #ff0000">'</span> <span style="COLOR: #000000">)&nbsp;</span> <span style="COLOR: #808080">+</span> <span style="FONT-WEIGHT: bold; COLOR: #800000">1</span> <span style="COLOR: #000000">);</span> <br>2007/2/26<br>2007/2/27<br>2007/2/28<br>2007/3/1<br>注:能查询到的最大天数受user_objects个数的制约。<br><a title=see href="http://www.blogjava.net/vip01/archive/2007/04/26/113785.html">see</a><br>
<img src ="http://www.blogjava.net/leekiang/aggbug/113964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2007-04-27 05:00 <a href="http://www.blogjava.net/leekiang/archive/2007/04/27/113964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>