Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

TSQL sprawdza, czy istnieje określona sekwencja wierszy

Myślę, że można to rozwiązać za pomocą rekurencyjnego 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';

Zasadniczo robi to (rekursywnie) łączenie wszystkich wartości next_status_id z pojedynczym ciągiem, z którym można porównać.

Z Twoich przykładowych danych nie jest dla mnie jasne, który wiersz oznacza „początek” historii zmian statusu zamówienia. Będziesz musiał dostosować miejsce w pierwszej części unii, aby wybrać właściwy wiersz „początkowy”.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wybierz pierwsze 3 wiersze każdej tabeli w bazie danych

  2. WYBRAĆ wiersze z czasem 30 minut lub krótszym?

  3. Wycofaj wewnętrzną transakcję zagnieżdżonej transakcji

  4. Pomoc z rekurencyjnym dołączaniem zapytań CTE do drugiej tabeli

  5. Zapytanie, aby uzyskać najnowsze dołączenie na innym stole z datą