下面的场景需要SQl查询

时间:2010-10-01 09:16:25

标签: sql sql-server tsql

alt text

这里对于'CF061W'部分是25,我将选择其fparinum值为25的记录现在我将获得这些部件FA061W,HRD20600和SD1201。现在我将再次选择其fparinum值为上述检索部件FA061W,HRD20600和SD1201等的记录。这应该持续到最高水平(flevel),对于上表,它达到4级。

现在我想要单个sql查询,它将检索父部件'CF061W'的所有记录。

提前致谢

Pradeep

3 个答案:

答案 0 :(得分:1)

我可能有连接条件列:INNER JOIN PartHierarchy ph ON n.finum = ph.fparinum错误的方法(不熟悉您的架构)。

WITH PartHierarchy (finum, part, fparinum , dsono, flevel) AS
(
   -- Base case
   SELECT
      finum, 
      part, 
      fparinum, 
      dsono, 
      1 as flevel
   FROM myTablename
   WHERE fparinum  = 0

   UNION ALL

   -- Recursive step
   SELECT
      n.finum, 
      n.part, 
      n.fparinum, 
      n.dsono, 
      ph.flevel + 1 AS flevel
   FROM myTablename n
      INNER JOIN PartHierarchy ph ON n.finum = ph.fparinum 
)

SELECT *
FROM PartHierarchy 
ORDER BY flevel 

这是一个经典的递归CTE(Common Table Expression)

答案 1 :(得分:1)

这对你有用

WITH TAB_CTE AS (
SELECT finum, part, fparinum, flevel
FROM TABTEST
WHERE  PART='CF061W'
UNION ALL
SELECT e.finum, e.part, e.fparinum,   e.flevel
FROM TABTEST e
INNER JOIN TAB_CTE ecte ON ecte.finum = e.fparinum 
)
SELECT *
FROM TAB_CTE

输出

finum       part           fparinum flevel
25          CF061W          0           1
26          FA061w          25          2
27          hrd20600        25          2
35            sd1201        25              2
28          f1024           27          3

答案 2 :(得分:0)

这几乎是何时使用递归CTE的教科书示例。

有很多文章详细说明了该怎么做。例如。在MSDN上这个: http://msdn.microsoft.com/en-us/library/ms186243.aspx