查看: 5609|回复: 5

[原创] 一个高级SQL语句问题

[复制链接]
论坛徽章:
5
咸鸭蛋
日期:2013-05-29 20:03:22奥迪
日期:2013-08-11 14:11:02Jeep
日期:2013-11-25 20:55:342014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
跳转到指定楼层
1#
发表于 2006-8-28 12:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
假设有一张表,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语句怎么写?请教高手!谢谢
论坛徽章:
44
双鱼座
日期:2016-01-07 20:57:31奔驰
日期:2013-08-02 22:22:552013年新春福章
日期:2013-02-25 14:51:24迷宫蛋
日期:2013-01-29 22:12:11蛋疼蛋
日期:2013-01-07 15:50:53ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28紫蛋头
日期:2011-07-31 11:27:01蜘蛛蛋
日期:2011-06-14 14:20:33蛋疼蛋
日期:2011-06-03 19:39:27SQL大赛参与纪念
日期:2011-04-13 12:08:17
2#
发表于 2006-8-28 13:00 | 只看该作者
connect by

使用道具 举报

回复
论坛徽章:
2
生肖徽章2007版:猪
日期:2008-02-25 09:49:28奥运会纪念徽章:羽毛球
日期:2008-05-24 11:31:29
3#
发表于 2006-8-28 13:19 | 只看该作者
最初由 mychary 发布
[B]connect by [/B]



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>

使用道具 举报

回复
论坛徽章:
2
生肖徽章2007版:猪
日期:2008-02-25 09:49:28奥运会纪念徽章:羽毛球
日期:2008-05-24 11:31:29
4#
发表于 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>

使用道具 举报

回复
论坛徽章:
57
马上加薪
日期:2014-02-19 11:55:142011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:41:01ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010系统架构师大会纪念
日期:2010-09-03 16:39:572010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010新春纪念徽章
日期:2010-03-01 11:21:02
5#
发表于 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

使用道具 举报

回复
论坛徽章:
5
咸鸭蛋
日期:2013-05-29 20:03:22奥迪
日期:2013-08-11 14:11:02Jeep
日期:2013-11-25 20:55:342014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
6#
 楼主| 发表于 2006-8-28 13:30 | 只看该作者
多些两位高手

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表