sql >> Databasteknik >  >> RDS >> Oracle

Får fel som ORA-32044:cykel upptäckts vid exekvering av rekursiv WITH-fråga

Din kod kommer att fungera bra förutom endast ett datatillstånd, det vill säga när din to_customer (1000022560394) själv har startat transaktionen i första hand och efter en viss nivå av transaktionen returneras den endast till honom.

T.ex. Exempel på datauppsättning

I det här fallet kommer din rekursiva del av frågan att hitta alla dess villkor sanna även i slutet av transaktionen, eftersom data finns där både i din normala tabell och i inkrementella datauppsättningar.

En lösning är att skapa en matchningsflagga för att bestämma antalet möten och undvika oändlig loop:

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;  



  1. Fördelar med att använda SQL Ordinal Position Notation?

  2. Hur upptäcker man en återställning i MySQL-lagrad procedur?

  3. ALTERNATIV (OMKOMPILERA) är alltid snabbare; Varför?

  4. Oracle SQL:variabler som används i stället för tabellnamn