2015-02-09 69 views
0

我仍然遇到一些递归查询的问题,这些问题让我很难定位 。我会尽量具体一些,但是我不能重现我更简单的例子...因此,如果需要另一个表格视图,请询问。在递归查询(Oracle)中难以理解的多个相同的结果

当试图获得我的表中互连链的“路径”后,我得到了一些非常奇怪的双重结果(但看起来完全相同)。让后一看,这里是我能注意:

当返回我需要什么不递归,我得到:

 

SELECT 
     instr_id, sensor_id_in, sensor_id_out, date_begin, date_end 
FROM ais_connect 
JOIN ais_sensor ON ais_sensor.sensor_id = ais_connect.sensor_id_in 
JOIN ais_sensor_catalog ON ais_sensor_catalog.sensor_catal_id = ais_sensor.sensor_catal_id 
JOIN ais_instr_catalog ON ais_instr_catalog.instr_catal_id = ais_sensor_catalog.instr_catal_id 
WHERE ((date_begin is null or date_begin < to_date('20150120090025','YYYYMMDDHH24MISS') 
AND  (date_end is null or date_end >=to_date('20150120090025','YYYYMMDDHH24MISS')) 

returns : 

    INSTR_ID SENSOR_ID_IN SENSOR_ID_OUT DATE_BEGIN   DATE_END                                           
---------- ------------ ------------- ------------------- -------------------                                         
     37   37   33 01/03/2012 12:00:00                                              
     31   30    2 10/04/2012 12:00:00                                              
     198   225   223 10/12/2014 09:47:03                                              
     37   40   34 01/03/2012 12:00:00                                              
     39   46   221 14/01/2015 00:00:00                                              
     39   46    9 21/02/2012 15:00:00                                              
     39   46   19 21/02/2012 15:00:00                                              
     39   46    8 21/02/2012 15:00:00                                              
     39   46   20 21/02/2012 15:00:00 
     39   46   13 21/02/2012 15:00:00 
     39   46   16 21/02/2012 15:00:00 
     39   46   15 21/02/2012 15:00:00 
     39   46   14 21/02/2012 15:00:00 
     39   46   12 21/02/2012 15:00:00 
     39   46   21 24/05/2012 12:00:00 
     39   46   50 07/08/2014 13:24:00 
     181   205   202 15/09/2014 10:00:00 
     181   205   203 15/09/2014 10:00:00 
     37   41   36 13/03/2012 12:00:00 
     37   42   45 24/05/2012 00:00:00 
     175   199   93 15/09/2014 10:00:00 
     196   223   219 30/11/2014 14:00:00 
     167   184   208 15/09/2014 10:00:00 
     27   26   47 21/11/2013 11:34:00 
     26   25   48 21/11/2013 11:34:00 
     165   182   218 05/11/2014 00:00:00 
     197   224   220 30/11/2014 14:00:00 
     166   183   217 05/11/2014 00:00:00 
     41   49    5 21/11/2013 12:34:00 

但是当我尝试这样做:

 
SELECT 
     level lvl, 
     connect_by_root instr_id top, 
     connect_by_isleaf is_leaf, 
     sys_connect_by_path(sensor_id_in, ';') chain_id 
FROM ais_connect 
JOIN ais_sensor ON ais_sensor.sensor_id = ais_connect.sensor_id_in 
JOIN ais_sensor_catalog ON ais_sensor_catalog.sensor_catal_id = ais_sensor.sensor_catal_id 
JOIN ais_instr_catalog ON ais_instr_catalog.instr_catal_id = ais_sensor_catalog.instr_catal_id 
WHERE (date_begin is null or date_begin =to_date('20150120090025','YYYYMMDDHH24MISS')) 
START WITH sensor_id_out = '219' 
CONNECT BY prior sensor_id_in = sensor_id_out 
ORDER BY lvl 

It returns me : 

     LVL  TOP IS_LEAF CHAIN_ID 
---------- ---------- ---------- ---------------- 
     1  196   0 ;223 
     2  196   1 ;223;225 
     2  196   1 ;223;225 

任何想法关于为什么我能得到这条双线?

+0

查询虽然不同;您显示的示例数据也受到结束日期的限制,并且可能会有更早的开始日期。如果在connect-by版本中使用完全相同的'where'子句,你还会得到重复吗?看起来你的表中只有两行有不同的日期,或者一条225条记录的结束行,并且你不会再过滤它们了吗? – 2015-02-09 12:15:24

回答

0

请注意,where子句在connect by之后处理。如果这不是所需的行为,请尝试使用connect by -query来包装您的where-query。

select ... 
from (select ... 
     from ... 
     where ...) 
start with ... 
connect by ... 
order by ... 
+0

非常感谢这非常简单但有效的答案! – Vigon 2015-02-10 13:58:55