2017-03-13 5 views
0

私は、階層データは、このような表で表されている場合:階層データでは、ルートレベルまでのすべてのノードを選択する方法は?

team_id team_name  parent_id 
1   Sales   (null) 
2   Executives (null) 
3   EMEA Sales 1 
4   APAC Sales 1 
5   UK Sales  3 

1 TEAM_IDを考えると、どのようなルートレベルにつながるすべてのteam_idsを選択するためのSQLでしょうか?私はOracle 11.2を使用しています。 (5,3,1)
あるいは、TEAM_ID 4を与え、次いで、出力は次のようになります:例えば

は、TEAM_ID 5を与え、team_idsがあるべきで返さ(4,1)

それは合理的に自明です - 特定のノードから木の枝を横断

SELECT team_id, team_name, parent_id 
     FROM teams 
START WITH team_name = 'Sales' 
CONNECT BY PRIOR team_id = parent_id 
; 

私は反対を探しています:のようなものを使用して、データの階層構造を示す、木の枝を下にトラバースします。

ここでのサンプルデータはわずか3レベルですが、私は任意のレベル数のソリューションを探しています。

+0

CONNECT BYで読んでください。予想されるサンプル出力を表示してください。 – OldProgrammer

+0

@OldProgrammer確かに、私はCONNECT BYをよく知っています。ルートノードからツリーのブランチをトラバースするのはかなり簡単ですが、ツリーを1つだけトラバースして、ツリーをトラバースしたいと考えています。 – osullic

+0

先に接続してください。 – OldProgrammer

答えて

1
WITH test AS 
    (SELECT 1 team_id, 'Sales team_name', NULL parent_id FROM dual 
    UNION 
    SELECT 2, 'Executives' , NULL FROM dual 
    UNION 
    SELECT 3, 'EMEA Sales', 1 FROM dual 
    UNION 
    SELECT 4, 'APAC Sales', 1 FROM dual 
    UNION 
    SELECT 5, 'UK Sales' , 3 FROM dual 
) 
SELECT team_id 
FROM test 
    START WITH team_id   = 5 
    CONNECT BY prior parent_id = team_id 
+0

もちろん。 PRIORは親行を指しますが、「親」はツリーをどのように視覚化するかに依存する任意の概念です。 parent_idフィールドでPRIOR演算子を使用すると、階層は「逆転」し、「上向き」を横断するのは簡単になります。ありがとうございました – osullic

+0

喜んで助けてください。 .. – OldProgrammer

関連する問題