首页 > 解决方案 > 具有定义起点的递归 SQL 查询

问题描述

我试图让递归查询与定义的起点一起工作。

这是我表中的一些示例数据,名为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行。我的真实数据集有数以千计的序列号,我需要能够从中挑选出哪些序列号进行追溯,而不是对表中的每个序列号进行递归的广泛查询。

我已经尝试阅读几篇文章和示例以使其正常工作,包括此处没有成功的文章。

预先感谢您的帮助。

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

解决方案


您将连接字段倒置。

SQL 演示

;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

输出

| Serial_No | From_Container | Part_Key | Part_Operation_Key |
|-----------|----------------|----------|--------------------|
|      1234 |           1233 |     5678 |                  5 |
|      1233 |           1232 |     5678 |                  4 |

推荐阅读