求教!这个查询该怎么写?

chenrl 2002-10-24 08:04:14
我有一个号段表
create table hdb(startno number(6),endno number(6));
主键是(startno,endno)

表里面存放了一些起始和终止的号码段,来表示一段连续的号码,如:
123400 123499
123500 123599
123510 123600

其中有一些号段有重叠,如:123500~123599 和123510~123600就有部分重叠。
求教,能不能有一个算法,最好是一条sql语句,把所有发生重叠的号段查出来。
另外,这张号段表实际上有上万条记录,号码范围也在千万级,(我在问题中作了简化),算法一定要高效,用游标遍历整张表的算法不可取。
我最希望有人能用一条sql搞定,先谢谢了。
...全文
17 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hushuangyang 2002-10-25
  • 打赏
  • 举报
回复
三千兄的写法效率高:

我做了一个测试,有一万多条记录,只要一执行结果就会出来。
KingSunSha 2002-10-24
  • 打赏
  • 举报
回复
select * from hdb x
where exists (select 'x' from hdb
where rowid != x.rowid
and (startno between x.startno and x.endno
or endno between x.startno and x.endno));
penitent 2002-10-24
  • 打赏
  • 举报
回复
这里有求重复记录的最好算法。可以查出指定重复的列的记录
http://www.oradb.net/sql/find0.htm
hushuangyang 2002-10-24
  • 打赏
  • 举报
回复
上面算法有问题:

select distinct a.startno,a.endno from hdb a,hdb b where a.rowid<>b.rowid and (b.endno>=a.startno and b.endno<=a.endno);
comcn 2002-10-24
  • 打赏
  • 举报
回复
对于重复记录,可以用DISTINCT方法去除 ,如
select DISTINCT a.startno,a.endno from hdb a,hdb b where a.endno-a.startno<b.endno-b.startno
chenrl 2002-10-24
  • 打赏
  • 举报
回复
谢谢楼上的回答。
可是你的答案不对,最起码你的sql会产生迪卡尔积呀。
pausing 2002-10-24
  • 打赏
  • 举报
回复
select a.startno,a.endno from hdb a,hdb b where a.endno-a.startno<b.endno-b.startno

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧