Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

TSQL vérifie si une séquence de lignes spécifique existe

Je pense que cela peut être résolu en utilisant un CTE récursif :

with change_tree as 
(
  SELECT order_id,
         previous_status_id, 
         next_status_id,
         cast(next_status_id as varchar(max)) as status_path
  FROM status_change
  WHERE previous_status_id = 1
    AND order_id = 2

  UNION ALL 

  SELECT sc.order_id,
         sc.previous_status_id,
         sc.next_status_id,
         ct.status_path + ',' + cast(sc.next_status_id as varchar(max))
  FROM status_change sc 
    JOIN change_tree ct ON ct.next_status_id = sc.previous_status_id AND ct.order_id = sc.order_id
)
SELECT *
FROM change_tree
WHERE status_path = '2,3,5';

Cela consiste essentiellement à concaténer (récursivement) toutes les valeurs de next_status_id en une seule chaîne à laquelle vous pouvez comparer.

D'après vos exemples de données, je ne vois pas clairement quelle ligne marque le "début" d'un historique de changement de statut de commande. Vous devrez ajuster où dans la première partie de l'union pour sélectionner la ligne "de départ" correcte.