数据库一张表中 有 s_position  和  e_position 两个字段,,  分别用来存储 其实位置和终止位置,现在需要查询出表中位置存在重叠部分的数据,比如:
ID     s_position   e_position
  1         0                   15
  
  2         7                  29
  3         31                40
  4         45                 50数据之间只要有重复就能找出来求高手指点一下

解决方案 »

  1.   

    select   a.s_position ,  b.e_position  from table a, table b where  a.s_position=b.e_position  会带来至少平方级别的数据累计(不适合大表)
      

  2.   

    可以考虑用LAG函数,原理是把S_POSITION和E_POSITION排成一行,然后按POSITION排序,如果出现后一个ID小于前一个ID,则为要抓取的重叠部分SELECT *
      FROM (SELECT ID,
                   POSITION,
                   LEAD(ID, 1, 0) OVER(ORDER BY POSITION) AS NEXTID
              FROM (SELECT ID, S_POSITION AS POSITION
                      FROM TABLE
                    UNION
                    SELECT ID, E_POSITION AS POSITION 
                     FROM TABLE))
     WHERE ID > NEXTID
       AND NEXTID <> 0
      

  3.   

    select t1.*, decode(sign(s_position - lag(e_position) over(order by s_position)), -1, '重合')  ll from tab t1;
      

  4.   

    select * from table where s_position = e_position,这样写不行么?