具有定义起点的递归SQL查询

时间:2018-07-03 18:36:53

标签: sql-server sql-server-2012 recursive-query

我试图获取一个递归查询,以使用定义的起点。

这是我的表中的一些示例数据,称为Part_v_Container

Serial_No   From_Container  Part_Key    Part_Operation_Key
1234                1233    5678         5
1233                1232    5678         4
1231                1230    5678         3
1230                NULL    5678         2

基本上,我们会提供一个序列号,然后在整个过程中,我需要在所有先前的序列号From_Container之后进行追溯。在我的真实查询中,我将以Serial_No开头是用户定义的变量。

这是我的尝试:

;WITH Recursive_cte AS
(SELECT 
  PContainer.Serial_No
  ,PContainer.From_Container
  ,PContainer.Part_Key
  ,PContainer.Part_Operation_Key

  FROM Part_v_Container AS PContainer
  WHERE Serial_No LIKE '1234'  -- Will be user defined variable

UNION ALL

SELECT 
    PContainer.Serial_No
    ,PContainer.From_Container
    ,PContainer.Part_Key
    ,PContainer.Part_Operation_Key  
  FROM Recursive_cte
  INNER JOIN
  Part_v_Container AS PContainer
  ON PContainer.From_Container = Recursive_cte.Serial_No 
  )

 SELECT * 
 FROM Recursive_cte

但是,这仅返回一行,即Serial_No = 1234行。我的真实数据集具有成千上万的序列号,我需要能够选择从中进行追溯的序列号,而不是对表中的每个序列都进行递归的广泛查询。

我尝试阅读几篇文章和示例来使它起作用,其中包括一本here,但没有成功。

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您将联接字段颠倒了。

SQL Demo

#

输出

;WITH Recursive_cte AS (
  SELECT 
    PContainer.Serial_No
  , PContainer.From_Container
  , PContainer.Part_Key
  , PContainer.Part_Operation_Key

  FROM Part_v_Container AS PContainer
  WHERE Serial_No = 1234  -- Will be user defined variable

UNION ALL

  SELECT 
      PContainer.Serial_No
    , PContainer.From_Container
    , PContainer.Part_Key
    , PContainer.Part_Operation_Key  
  FROM Recursive_cte
  INNER JOIN  Part_v_Container AS PContainer
     ON Recursive_cte.From_Container = PContainer.Serial_No 
)

SELECT * 
FROM Recursive_cte