2016-04-04 148 views
0

我有一个包含数千条记录的processDependency表。样本记录给出如下:以下情况下的SQL查询

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

所以,当我运行SQL查询我应该能够如下推导:

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

    任何人都可以帮助我与一般的SQL。

+0

标记正在使用的dbms –

+0

我不相信你可以有无限深度的层次处理的通用查询。您将需要使用RDBMS特定的功能。 –

+0

所以,如果我们有一个明确的深度说例如12 ..那么有可能吗? –

回答

1

这是不完全正确,因为它会从PROC

所有路径,但你并没有明确哪一个应该首先使用。

无论如何它应该给你一个想法。

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查询后的工作。您的回答非常有帮助。 –