Mã của bạn sẽ hoạt động tốt chỉ ngoại trừ một điều kiện dữ liệu đó là khi chính khách hàng của bạn (1000022560394) đã bắt đầu giao dịch ngay từ đầu và sau một số cấp độ giao dịch, nó sẽ chỉ được trả lại cho anh ta.
Ví dụ: Tập dữ liệu mẫu
Đối với trường hợp này, phần truy vấn Đệ quy của bạn sẽ tìm thấy tất cả các điều kiện của nó đúng ngay cả khi kết thúc giao dịch, vì dữ liệu sẽ ở đó cả trong bảng bình thường và tập dữ liệu gia tăng của bạn.
Một giải pháp là tạo cờ đối sánh để xác định số lần chạm trán của nó và tránh vòng lặp vô hạn:
WITH EmpsCTE (affiliation_id, from_customer_id,to_customer_id, to_name,level1,match_count)
AS
(
SELECT affiliation_id, from_customer_id,to_customer_id, to_name, 0, 0 match_count
FROM affiliation aff
WHERE to_customer_id != from_customer_id
and to_customer_id = 1000022560394
UNION ALL
SELECT aff.affiliation_id, aff.from_customer_id,aff.to_customer_id, aff.to_name, m.level1 + 1,1 match_count
FROM affiliation aff
INNER JOIN EmpsCTE m
ON aff.to_customer_id = m.from_customer_id
where m.match_count=0
)
SELECT * FROM EmpsCTE;