sql >> Databasteknik >  >> RDS >> Sqlserver

TSQL kontrollera om det finns en specifik radsekvens

Jag tror att detta kan lösas med en rekursiv CTE:

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';

Vad detta i huvudsak gör är att (rekursivt) sammanfoga alla värden för nästa_status_id till en enda sträng som du kan jämföra med.

Från dina exempeldata är det inte klart för mig vilken rad som markerar "början" av en orderstatusändringshistorik. Du måste justera var i den första delen av föreningen för att välja rätt "start"-rad.



  1. Välj information från tabellen där raden har maxdatum

  2. Hur man separerar en post för att få beloppet

  3. MySQL-fråga - optimerad

  4. Hur förvandlar man denna MySQL SELECT-fråga till en DELETE-fråga?