Рекурсивный SQL-запрос с определенной начальной точкой - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь заставить рекурсивный запрос работать с определенной начальной точкой.

Вот некоторые примеры данных из моей таблицы под названием 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. Мой реальный набор данных имеет тысячи серийных номеров, и мне нужно иметь возможность выбрать, какие из них я выберу для отслеживания, а не широкий запрос, который является рекурсивным для каждого в моей таблице.

Я попытался прочитать несколько статей и примеров, чтобы заставить это работать, включая одну здесь , но безуспешно.

Заранее благодарю за помощь.

1 Ответ

0 голосов
/ 03 июля 2018

Вы перевернули поля объединения.

Демонстрация 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 |
...