Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

TSQL kiểm tra xem chuỗi các hàng cụ thể có tồn tại hay không

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".



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi khi chuyển đổi kiểu dữ liệu varchar

  2. Tại sao không có hàm cửa sổ trong mệnh đề where?

  3. Sử dụng máy chủ sql Convert Chức năng để chuyển đổi hijri sang ngày Gregorian

  4. Khóa ngoại có tự động tạo chỉ mục không?

  5. Các phương pháp phân trang của SQL Server 2008?