Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Obtendo erro como ORA-32044:ciclo detectado ao executar a consulta recursiva WITH


Seu código funcionará bem, exceto apenas por uma condição de dados que é quando seu to_customer (1000022560394) iniciou a transação em primeiro lugar e depois de algum nível de transação ela está sendo retornada apenas para ele.

Por exemplo, Conjunto de dados de amostra

Para este caso, sua parte recursiva da consulta encontrará todas as suas condições verdadeiras mesmo no final da transação, pois os dados estarão lá tanto na sua tabela normal quanto no conjunto de dados incremental.

Uma solução é criar um match-flag para determinar seu número de encontros e evitar loops infinitos:
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;