楼主: lastwinner

[精华] Oracle层次查询和分析函数在号段选取中的应用

[复制链接]
论坛徽章:
3
鲜花蛋
日期:2011-12-09 15:07:542012新春纪念徽章
日期:2012-01-04 11:58:182013年新春福章
日期:2013-02-25 14:51:24
发表于 2013-4-1 22:44 | 显示全部楼层
思想是不会过时滴!!!

使用道具 举报

回复
招聘 : 系统分析师
论坛徽章:
483
马上有钱
日期:2014-02-19 11:55:14itpub13周年纪念徽章
日期:2014-09-29 01:14:14itpub13周年纪念徽章
日期:2014-10-08 15:15:25itpub13周年纪念徽章
日期:2014-10-08 15:15:25马上有对象
日期:2014-10-12 11:58:40马上有车
日期:2014-11-16 17:11:29慢羊羊
日期:2015-02-09 17:04:38沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31ITPUB年度最佳版主
日期:2015-03-18 15:48:48
 楼主| 发表于 2013-4-2 02:50 | 显示全部楼层
lodezao 发表于 2013-4-1 22:44
思想是不会过时滴!!!

开发语言很有可能会过时,但算法很少有可能会过时

使用道具 举报

回复
认证徽章
论坛徽章:
286
生肖徽章2007版:虎
日期:2014-06-23 20:17:04生肖徽章2007版:虎
日期:2014-09-18 12:50:09生肖徽章2007版:虎
日期:2014-11-14 14:21:28生肖徽章2007版:虎
日期:2014-06-23 20:42:17生肖徽章2007版:虎
日期:2014-06-23 20:42:17紫水晶
日期:2017-04-06 13:47:28红宝石
日期:2017-04-06 13:47:15秀才
日期:2017-04-06 13:42:06秀才
日期:2017-04-06 13:41:23秀才
日期:2017-03-28 15:59:38
发表于 2013-7-22 17:34 | 显示全部楼层
今天发了个帖子,刚好是关于号段的,搜索到了这个精华帖,很不错
不过看的过程中,发现了一个错误,如下。。。。。。

3.3.1        题例
table T,列:serial_no
我想能够查询一下serial_no这个字段的不连续的值。
例如:
serial_no
1
2
3
4
6
8
9
10
我想一个sql语句查出来缺失的号码,
显示结果为:
5
7
--------------------------
--------------------------
create table test_3(serial_no number);
insert into test_3 values(1);
insert into test_3 values(2);
insert into test_3 values(3);
insert into test_3 values(4);
insert into test_3 values(6);
insert into test_3 values(8);
insert into test_3 values(9);
insert into test_3 values(10);
commit;

--版主提供的sql好像结果不对
select distinct s + level - 1 rlt
  from (select lag(serial_no, 1) over(order by serial_no) + 1 S,
               serial_no - 1 E
          from test_3 t)
where E - S <> 0
connect by level <= e - s
order by 1;

--正确的应该是这样的
select distinct s + level - 1 rlt
  from (select lag(serial_no, 1) over(order by serial_no) + 1 S,
               serial_no - 1 E
          from test_3 t)
where E - S = 0  or e - s > 1
connect by level <= e - s+1
order by 1;

--不过如果再加一行大一点的数字,上面的sql效率不怎么样
insert into test_3 values(1700);

--这样写,效率还可以(udfrog提供的
select s + level - 1 serial_no
  from (select lag(serial_no, 1) over(order by serial_no) + 1 S,
               serial_no - 1 E
          from test_3)
where E - S = 0
    or e - s > 1
connect by prior s = s
       and level <= e - s + 1
       and prior dbms_random.value is not null
order by 1;

使用道具 举报

回复
招聘 : 系统分析师
论坛徽章:
483
马上有钱
日期:2014-02-19 11:55:14itpub13周年纪念徽章
日期:2014-09-29 01:14:14itpub13周年纪念徽章
日期:2014-10-08 15:15:25itpub13周年纪念徽章
日期:2014-10-08 15:15:25马上有对象
日期:2014-10-12 11:58:40马上有车
日期:2014-11-16 17:11:29慢羊羊
日期:2015-02-09 17:04:38沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31ITPUB年度最佳版主
日期:2015-03-18 15:48:48
 楼主| 发表于 2013-7-23 02:32 | 显示全部楼层
hh7yx 发表于 2013-7-22 17:34
今天发了个帖子,刚好是关于号段的,搜索到了这个精华帖,很不错
不过看的过程中,发现了一个错误,如下。 ...

这问题在书里都改了,论坛懒得改了

使用道具 举报

回复
论坛徽章:
0
发表于 2013-9-11 11:43 | 显示全部楼层
hh7yx 发表于 2013-7-22 17:34
今天发了个帖子,刚好是关于号段的,搜索到了这个精华帖,很不错
不过看的过程中,发现了一个错误,如下。 ...

select s + level - 1 serial_no
  from (select lag(serial_no, 1) over(order by serial_no) + 1 S,
               serial_no - 1 E
          from test_3)
where E - S = 0
    or e - s > 1
connect by prior s = s
       and level <= e - s + 1
       and prior dbms_random.value is not null
order by 1;

俺是初学者,能说下 这个思路不,connect by  后面都看不懂了

使用道具 举报

回复
论坛徽章:
4
2011新春纪念徽章
日期:2011-02-18 11:42:48奥迪
日期:2013-12-07 17:06:42优秀写手
日期:2013-12-18 09:29:09日产
日期:2014-01-15 14:18:32
发表于 2014-1-10 10:20 | 显示全部楼层
靠,我发现我错过好多精华帖。

使用道具 举报

回复
认证徽章
论坛徽章:
135
玉石琵琶
日期:2014-07-02 10:11:04九尾狐狸
日期:2014-07-02 10:11:04紫蜘蛛
日期:2014-07-02 10:11:04蓝色妖姬
日期:2014-07-02 10:11:04蓝色妖姬
日期:2014-08-28 15:17:25马上加薪
日期:2014-08-07 12:47:01马上加薪
日期:2014-07-23 11:55:37马上加薪
日期:2014-07-21 16:24:17马上加薪
日期:2014-07-17 17:01:52马上加薪
日期:2014-07-17 16:15:19
发表于 2014-5-9 17:17 | 显示全部楼层
实验了一把..   学习了     收藏

使用道具 举报

回复
论坛徽章:
22
问答徽章
日期:2014-01-06 16:50:41秀才
日期:2015-10-26 09:55:08秀才
日期:2015-11-11 09:48:44秀才
日期:2015-11-11 10:22:49秀才
日期:2015-11-12 17:43:40秀才
日期:2015-12-14 15:02:13秀才
日期:2016-01-21 13:42:39秀才
日期:2016-01-25 14:55:31秀才
日期:2016-02-18 10:08:14秀才
日期:2016-03-24 09:20:52
发表于 2014-5-13 11:09 | 显示全部楼层
经鉴定,属于好贴

使用道具 举报

回复
论坛徽章:
6
授权会员
日期:2007-08-09 15:46:04ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB8周年纪念徽章
日期:2009-09-27 10:21:20祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26优秀写手
日期:2014-07-11 06:00:13
发表于 2014-7-1 13:41 | 显示全部楼层
rownum,connect by的效率还比不上游标。

使用道具 举报

回复
论坛徽章:
6
授权会员
日期:2007-08-09 15:46:04ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB8周年纪念徽章
日期:2009-09-27 10:21:20祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26优秀写手
日期:2014-07-11 06:00:13
发表于 2014-7-1 13:42 | 显示全部楼层
几十万,上百万数据的插入,利用这个效率很低。

使用道具 举报

回复

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

本版积分规则 发表回复

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