2016-04-04 12 views
0

私は何千ものレコードを持つprocessDependencyテーブルを持っています。私は、SQLクエリを実行すると、だから私は以下導き出すことができるはず以下のシナリオのSQLクエリ

Proc DepProc 
P1 P2 
P2 P3 
P3 P4 
P4 P5 
P6 P7 

:サンプルレコードは、以下に示す

  1. P1-P2-P3-P4-P5
  2. P6-P7

    誰もが一般的なSQLで私を助けることができます。それはPROC

    からすべてのパスを取得しますしかし、あなたは1が最初に使用されるべき明確にしなかったので、

+0

タグ –

+0

を使用しているDBMSが、私はあなたが無制限の深さを持つ階層処理のための一般的なクエリを持つことができることを信じていません。 RDBMS固有の機能を使用する必要があります。 –

+0

したがって、たとえば深さが定義されていれば、たとえば12となります。次に可能ですか? –

答えて

1

これは非常に適切ではありません。

いずれにしても、それはあなたに考えを与えるはずです。

SELECT recurse AS 
(
    SELECT Proc AS Start, 
      Proc||COALESCE('-'||DepProc,'') AS PATH, 
      DepProc as Next, 1 as Level 
    FROM table 

    UNION ALL 

    SELECT Start, 
      PATH||'-'||t.DepProc, 
      t.DepProc as Next, 
      Level+1 as Level 
    FROM recurse r 
    JOIN table t ON r.Next = t.Proc 
), recurseWithMax AS 
(
    SELECT PATH, Start, MAX(Level) OVER (Partition by Start) as Max, Level 
) 
SELECT Start, PATH 
FROM recurseWithMax 
WHERE Level = Max 
+0

@Hoganありがとう、そのCTEクエリを調整した後の作業。あなたの答えは本当に非常に有用でした。 –

関連する問題