将第n行与第n + 1行进行比较,如果它位于第n行的范围内,则打印n + 1行USNG ORACLE QUERY

时间:2014-02-04 06:12:10

标签: sql oracle

我有一张像

这样的表格
ID     name   Start_no     End_no
1       a       2           123  
2       b       3           65
3       c       191         199
4       d       201         225
5       e       220         223
6       f       221         224

我试过了:

SELECT  *   
  FROM IV_STOCK_DETAILS a
 where  a.STOCK_START_NO in ( select b.stock_end_no
                                from IV_STOCK_DETAILS B
                               where b.stock_start_no between a.stock_start_no 
                                                          AND A.STOCK_END_NO 
                                 AND B.STOCK_END_NO BETWEEN a.stock_start_no 
                                                        AND A.STOCK_END_NO  
                                 AND (a.stock_start_no - A.STOCK_END_NO) !=0  
                            )
ORDER BY cod_stock_branch, stock_start_no;

所以我需要逐行检查所有行及其之前的行,如果其start_noend_no位于前一个打印行的start_noend_no之内。在这种情况下,答案将是第2,5,6行......我只需要查询。

2 个答案:

答案 0 :(得分:3)

以下是使用LAG函数或Oracle的解决方案,可让您访问上一行。

而且,根据您的要求,您应该只从表中获得第2行和第5行,因为第6行的end_no为224,这不小于第5行的end_no 223

SELECT id, name, start_no, end_no 
FROM (
    SELECT id, name, start_no, end_no, 
           lag(start_no, 1, 0) over (order by id) prev_start_no ,
           lag(end_no, 1, 0) over (order by id) prev_end_no
    FROM test
) 
WHERE start_no BETWEEN prev_start_no AND prev_end_no
AND end_no BETWEEN prev_start_no AND prev_end_no;

答案 1 :(得分:2)

加入救援!将表连接到先前的ID上,并在连接中包含范围测试。

SELECT iv.*
  FROM IV_STOCK_DETAILS AS iv
    JOIN IV_STOCK_DETAILS AS ivprev ON iv.id=ivprev.id+1
         AND ivprev.Start_no <= iv.Start_no
         AND iv.End_no <= ivprev.End_no