ITPUB??ì3
ITPUB论坛 » Oracle开发 » 一个高级SQL语句问题

标题: [原创] 一个高级SQL语句问题
离线 zj511025
初级会员



精华贴数 0
个人空间 0
技术积分 106 (15681)
社区积分 0 (261190)
注册日期 2005-1-28
论坛徽章:0
      
      

发表于 2006-8-28 12:00 
一个高级SQL语句问题

假设有一张表,A和B字段都是NUMBER,
A           B
1           2
2           3
3           4
4            
有这样一些数据
现在想用一条SQL语句,查询出这样的数据
1-》2-》3—》4
就是说,A和B的数据表示一种连接的关系,现在想通过A的一个值,去查询A所对应的B值,直到B为NULL为止,不知道这个SQL语句怎么写?请教高手!谢谢


只看该作者    顶部
在线/呼叫 mychary
高级会员



来自 合肥
精华贴数 0
个人空间 0
技术积分 6766 (180)
社区积分 158 (2635)
注册日期 2003-9-18
论坛徽章:9
ITPUB元老会员2007贡献徽章会员2006贡献徽章授权会员2008北京奥运纪念徽章:柔道2008北京奥运纪念徽章:花样游泳
数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星   

发表于 2006-8-28 13:00 
connect by


只看该作者    顶部
离线 淡若煙飛
曾经沧海


精华贴数 0
个人空间 0
技术积分 905 (2039)
社区积分 5 (15641)
注册日期 2006-3-1
论坛徽章:2
2008北京奥运纪念徽章:羽毛球生肖徽章2007版:猪    
      

发表于 2006-8-28 13:19 


QUOTE:
最初由 mychary 发布
connect by

SQL> select * from t;

         A          B
---------- ----------
         1          2
         2          3
         3          4
         4

SQL>
SQL> SELECT SUBSTR(MAX(SYS_CONNECT_BY_PATH(A.A, '->')), 3) RESULT
  2    FROM T A
  3   START WITH A.A = 1
  4  CONNECT BY A.A = PRIOR B
  5  /

RESULT
--------------------
1->2->3->4

SQL>


__________________

彼岸花,花开彼岸,
有花无叶,有叶无花,
花叶两不相见,生生相错……
-------------------------------------------------------------------
只看该作者    顶部
离线 淡若煙飛
曾经沧海


精华贴数 0
个人空间 0
技术积分 905 (2039)
社区积分 5 (15641)
注册日期 2006-3-1
论坛徽章:2
2008北京奥运纪念徽章:羽毛球生肖徽章2007版:猪    
      

发表于 2006-8-28 13:23 
如果列的值不为数字型时,可以这样!

SQL> select * from t;

A  B
-- --
A  B
B  F
C  D
F  W
W  

SQL>
SQL> SELECT SUBSTR(RESULT, 3) RESULT
  2    FROM (SELECT LENGTH(SYS_CONNECT_BY_PATH(A.A, '->')) LEN,
  3                 SYS_CONNECT_BY_PATH(A.A, '->') RESULT
  4            FROM T A
  5           START WITH A.A = 'A'
  6          CONNECT BY A.A = PRIOR B
  7           ORDER BY LEN DESC)
  8   WHERE ROWNUM = 1
  9  /

RESULT
--------------------
A->B->F->W

SQL>


__________________

彼岸花,花开彼岸,
有花无叶,有叶无花,
花叶两不相见,生生相错……
-------------------------------------------------------------------
只看该作者    顶部
离线 zhouwf0726
版主


精华贴数 5
个人空间 740
技术积分 7267 (174)
社区积分 101 (3354)
注册日期 2006-2-22
论坛徽章:17
现任管理团队成员ITPUB北京九华山庄2008年会纪念徽章管理团队2007贡献徽章蓝锆石授权会员2008北京奥运纪念徽章:篮球
BLOG每日发帖之星生肖徽章2007版:鸡生肖徽章2007版:鼠生肖徽章2007版:蛇生肖徽章2007版:虎生肖徽章2007版:龙

发表于 2006-8-28 13:25 
CREATE TABLE TEST(COL1 NUMBER(18,0),COL2 NUMBER(18,0));

INSERT INTO TEST VALUES(1,2);
INSERT INTO TEST VALUES(2,3);
INSERT INTO TEST VALUES(3,4);
INSERT INTO TEST VALUES(4,NULL);

INSERT INTO TEST VALUES(5,6);
INSERT INTO TEST VALUES(6,7);
INSERT INTO TEST VALUES(7,8);
INSERT INTO TEST VALUES(8,NULL);

INSERT INTO TEST VALUES(9,10);
INSERT INTO TEST VALUES(10,NULL);

select max(col) from(
select SUBSTR(col,1,CASE WHEN INSTR(col,'->')>0 THEN INSTR(col,'->') - 1 ELSE LENGTH(col) END) FLAG,col from(
select ltrim(sys_connect_by_path(col1,'->'),'->') col from (
select col1,col2,CASE WHEN LAG(COL2,1,NULL)  OVER(ORDER BY ROWNUM) IS NULL THEN 1 ELSE 0 END FLAG
from test
)
start with flag=1 connect by col1=prior col2
)
)
group by flag
;

MAX(COL)
--------------------------------------------------------------------------------
1->2->3->4
5->6->7->8
9->10


__________________
msn:zhouwf0726@hotmail.commail:zhouwf0726@163.com
只看该作者    顶部
离线 zj511025
初级会员



精华贴数 0
个人空间 0
技术积分 106 (15681)
社区积分 0 (261190)
注册日期 2005-1-28
论坛徽章:0
      
      

发表于 2006-8-28 13:30 
多些两位高手


只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问