आप अपने डेटा के भीतर चक्रों के कारण अनंत लूप में भाग रहे हैं, उदा.:1> 2> 3> 2> ... । समाधान उन पंक्तियों का ट्रैक रखना है जो पहले ही "खपत" हो चुकी हैं। सीटीई में सीमाओं के कारण, यह प्रत्येक सीटीई पंक्ति के इतिहास को शामिल करके किया जाना है, उदा। प्रत्येक पंक्ति में आने के लिए अपनाए गए पथ को जोड़कर। आप , Path
. को असम्बद्ध कर सकते हैं अंतिम पर select
यह देखने के लिए कि क्या हो रहा है।
-- Sample data.
declare @ACC as Table ( AccNo Int, Property Char );
insert into @ACC values
( 1, 'A' ), ( 1, 'B' ), ( 2, 'A' ), ( 2, 'C' ), ( 3, 'C' ), ( 4, 'D' );
select * from @ACC;
-- Recursive CTE.
with Groups as (
select distinct AccNo, AccNo as LinkedAccNo,
Cast( '|' + Cast( AccNo as VarChar(10) ) + '|' as VarChar(1024) ) as Path
from @ACC
union all
select G.AccNo, A.AccNo, Cast( Path + Cast( A.AccNo as VarChar(10) ) + '|' as VarChar(1024) )
from Groups as G inner join -- Take the latest round of new rows ...
@ACC as AP on AP.AccNo = G.LinkedAccNo inner join -- ... and get the Property for each ...
@ACC as A on A.Property = AP.Property -- ... to find new linked rows.
where G.Path not like '%|' + Cast( A.AccNo as VarChar(10) ) + '|%' )
select AccNo, LinkedAccNo -- , Path
from Groups
order by AccNo, LinkedAccNo;