Ihr Code wird gut funktionieren, außer für eine Datenbedingung, wenn Ihr to_customer (1000022560394) selbst die Transaktion überhaupt gestartet hat und nach einer gewissen Transaktionsebene nur an ihn zurückgegeben wird.
Beispiel:Beispieldatensatz
In diesem Fall findet Ihr rekursiver Teil der Abfrage alle Bedingungen selbst am Ende der Transaktion wahr, da die Daten sowohl in Ihrer normalen Tabelle als auch in Ihrem inkrementellen Datensatz vorhanden sind.
Eine Lösung besteht darin, ein Match-Flag zu erstellen, um die Anzahl der Begegnungen zu bestimmen und eine Endlosschleife zu vermeiden:
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;