2017-03-06 8 views
0

ソースが宛先を持っている場合は、すべてのSOURCE_IDをリストしたいと考えています。Oracle再帰

select SOURCE_ID, 
     LINK_TYPE, 
     DESTINATION_ID 
from LINK_TABLE 
where link_table.link_type=1 
and link_table.destination_is_deleted=0 
START WITH link_table.source_id='100' 
CONNECT BY PRIOR link_table.source_id=link_table.destination_id 

サンプル・データ、これは何が必要ですあなたは葉へのルートノードから階層を歩くしたいと仮定すると、

SOURCE_ID | DESTINATION_ID | LINK_TYPE| DESTINATION_IS_DELETED| 
----------|-----------------|----------|-----------------------| 
100  |  1500  | 1  |    0   | 
100  |  1200  | 1  |    0   | 
100  |  1300  | 1  |    1   | 
1500  |  600  | 1  |    0   | 
1500  |  700  | 1  |    0   | 
700  |  88  | 1  |    0   | 
+0

ごめんなさい、ありがとうございました。 –

答えて

1

select SOURCE_ID, 
     LINK_TYPE, 
     DESTINATION_ID 
from LINK_TABLE 
where link_table.link_type=1 
and link_table.destination_is_deleted=0 
START WITH link_table.source_id='100' 
CONNECT BY PRIOR link_table.destination_id = link_table.source_id 
/

それはスワップの問題ですCONNECT BY PRIOR節の参照先列。残念ながら、Oracle構文はここでは直感的ではありません:私は20年以上それを使用してきましたが、私はそれらが正しい方法を持っていることを確認するためにクエリをテストする必要があります:)

0

私はクエリ構造を変更しました問題を解決する。

select SOURCE_ID,DESTINATION_ID,link_table.source_class,link_table.linktype,link_table.destination_class 
from LINK_TABLE 
where (link_table.source_id in(select link_table.DESTINATION_ID from link_table where link_table.source_id='100'and link_table.linktype=1 and link_table.destination_isdeleted=0)) 
and (link_table.linktype=1) or (link_table.source_id='100')