Непонятные множественные идентичные результаты в рекурсивном запросе (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

Любая идея о том, почему я мог получить эту двойную линию?


person Vigon    schedule 09.02.2015    source источник
comment
Однако запросы разные; демонстрационные данные, которые вы показываете, также ограничены датой окончания и могут иметь более раннюю дату начала. Вы по-прежнему получаете дубликат, если точно такое же предложение where используется в версии для подключения? Похоже, у вас просто есть две строки в таблице с разными датами или строка с датой окончания для записи 225, и вы их больше не фильтруете?   -  person Alex Poole    schedule 09.02.2015


Ответы (1)


Обратите внимание, что предложение where обрабатывается после connect by. Если это нежелательное поведение, попробуйте обернуть запрос where с помощью connect by-query.

select ...
from ( select ...
       from ...
       where ... )
start with ...
connect by ...
order by ...
person Qualtagh    schedule 09.02.2015
comment
Большое спасибо за этот очень простой, но эффективный ответ! - person Vigon; 10.02.2015