sql >> Databáze >  >> RDS >> Sqlserver

TSQL kontroluje, zda existuje konkrétní sekvence řádků

Myslím, že to lze vyřešit pomocí rekurzivního 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';

To v podstatě dělá (rekurzivně) zřetězení všech hodnot next_status_id do jediného řetězce, se kterým můžete porovnávat.

Z vašich ukázkových údajů mi není jasné, který řádek označuje „začátek“ historie změn stavu objednávky. Budete muset upravit kde v první části sjednocení, abyste vybrali správný "počáteční" řádek.



  1. Jak odstranit položky z databáze sqlite pomocí třídy SQLiteOpenHelper

  2. Importujte soubor SQL do mysql

  3. Celkem nahoru Mezisoučet v zobrazení mřížky

  4. Bezpečné ukládání citlivých dat v databázi