2017-08-01 5 views
0

Dieses rekursive CTE läuft für immer (gibt nie Ergebnisse zurück), wenn die gleichen Ergebnisse per Hand erhalten würden, würde ungefähr 10 Sekunden dauern, wobei das meiste Kopieren-Einfügen ist.Rekursives CTE beendet nie

  • Habe ich den RekeyLevel Teil falsch implementiert? Steigt es nicht richtig auf?
  • Wie würde ich es so machen, dass die Rekursion stoppt, wenn keine Ergebnisse gefunden werden, anstatt eine Failsafe wie RekeyLevel <= 2 zu benötigen?

Aktuelle Abfrage:

with RekeysAllLevelsDeep as (

select 
a.claimid as Rekey 
,a.ClaimIDAdjFromOrig as Original 
,0 as RekeyLevel 

from <base table> (nolock) a 

where a.ClaimIDAdjFromOrig is not null 
    and a.ClaimIDAdjFromOrig <> a.ClaimID 


union all 


select 
a.claimid as Rekey 
,a.ClaimIDAdjFromOrig as Original 
,RekeyLevel + 1 

from RekeysAllLevelsDeep 

join <base table> (nolock) a 
    on RekeysAllLevelsDeep.Original = a.ClaimID 

where a.ClaimIDAdjFromOrig is not null 
    and a.ClaimIDAdjFromOrig <> a.ClaimID 
    and RekeyLevel <= 2 
) 

select distinct 
Rekey 
,Original 
,RekeyLevel 

from RekeysAllLevelsDeep 

where Original is not null 
    and Original <> Rekey 
    and Rekey = '(<number>)' 
+0

Begrenzung der Tiefe manuell, z. mit 'RekeyLevel', und das Untersuchen der Ergebnisse weist normalerweise auf das Problem hin. [This] (https://stackoverflow.com/questions/15080922/infinite-loop-cte-with-option-maxrecursion-0/15081353#15081353) Antwort zeigt eine Möglichkeit, Schleifen in Daten während der Rekursion zu behandeln. Tipp: Es ist hilfreich, Datenbankfragen mit der entsprechenden Software (MySQL, Oracle, DB2, ...) und der Version, z. 'sql-server-2014'. Unterschiede in Syntax und Funktionen beeinflussen oft die Antworten. Beachten Sie, dass 'tsql' die Auswahl einschränkt, aber die Datenbank nicht angibt. – HABO

+0

@HABO Tolle Tipps, danke! Ich habe ein 'SQL-Server-2014'-Tag hinzugefügt. Außerdem habe ich versucht, die Tiefe manuell zu begrenzen ('RekeyLevel <= 2'), habe aber immer noch das Problem. Das ließ mich vermuten, dass ich nicht richtig levelte und zum ersten Teil meiner Frage führte. Danke, dass du es gesehen hast, hoffentlich sieht jemand etwas. – puzzlepiece87

Antwort

0

Ich brauchte die Bedingung I außerhalb des rekursiven CTE verwendet zu bewegen, and Rekey = '(<number>)', im Inneren. Auf diese Weise brachte der rekursive CTE die korrekten Ergebnisse sofort zurück. Wenn die Bedingung außerhalb des rekursiven CTE lag, bedeutete das, dass der rekursive CTE diese Rekursion für jede Zahl in der gesamten Tabelle durchführte.