sql >> データベース >  >> RDS >> Sqlserver

特定の行シーケンスが存在するかどうかの TSQL チェック

    これは、再帰 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';
    

    これが本質的に行うことは、next_status_id のすべての値を比較可能な単一の文字列に (再帰的に) 連結することです。

    あなたのサンプル データからは、どの行が注文ステータスの変更履歴の「開始」を示しているのか明確ではありません。ユニオンの最初の部分の where を調整して、正しい「開始」行を選択する必要があります。



    1. SQLLDRによって複数のcsvを1つのテーブルにロードします

    2. MySQL-InnoDBテーブルのデータが変更されたかどうかを確認する最速の方法

    3. MySQL varchar(2000)とテキスト?

    4. MySqlを使用して利用可能な部屋を確認する