Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Fehler als ORA-32044:Zyklus beim Ausführen der rekursiven WITH-Abfrage erkannt

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;