Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

TSQL memeriksa apakah ada urutan baris tertentu

Saya pikir ini dapat diselesaikan dengan menggunakan CTE rekursif:

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

Apa yang pada dasarnya dilakukan adalah (secara rekursif) menggabungkan semua nilai next_status_id ke satu string yang dapat Anda bandingkan.

Dari data sampel Anda, tidak jelas bagi saya baris mana yang menandai "awal" dari riwayat perubahan status pesanan. Anda perlu menyesuaikan tempat di bagian pertama serikat untuk memilih baris "awal" yang benar.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mencoba Mengimpor File DBF FoxPro ke SQL Server

  2. Mengapa saya harus memutakhirkan dari SQL2000 ke SQL2005?

  3. Menulis CTE Rekursif menggunakan sintaks Entity Framework Fluent atau sintaks Inline

  4. Bagaimana cara memindahkan tabel ke skema di T-SQL

  5. Desain basis data untuk pengaturan pengguna