Tôi nghĩ điều này có thể được giải quyết bằng cách sử dụng CTE đệ quy:
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';
Điều này về cơ bản làm là (đệ quy) nối tất cả các giá trị của next_status_id vào một chuỗi duy nhất mà bạn có thể so sánh với.
Từ dữ liệu mẫu của bạn, tôi không rõ hàng nào đánh dấu "sự khởi đầu" của lịch sử thay đổi trạng thái đơn hàng. Bạn sẽ cần điều chỉnh vị trí trong phần đầu tiên của liên hợp để chọn đúng hàng "bắt đầu".