sql >> Database >  >> RDS >> Sqlserver

SQL Recursive CTE:Objecten zoeken die op eigenschap zijn gekoppeld

U komt in een oneindige lus terecht die wordt veroorzaakt door cycli binnen uw gegevens, bijvoorbeeld:1> 2> 3> 2> ... . De oplossing is om de rijen bij te houden die al zijn "geconsumeerd". Vanwege beperkingen in CTE's moet dit worden gedaan door de geschiedenis op te nemen in elke CTE-rij, b.v. door het pad samen te stellen dat is gevolgd om bij elke rij te komen. U kunt de commentaar verwijderen voor , Path op de laatste select om te zien wat er aan de hand is.

-- 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;


  1. Hoe SQL Server Manager Studio (SSMS) te installeren - SQL Server / TSQL-zelfstudie deel 1

  2. Postgresql Genereer_serie van maanden

  3. Hoe een vierkant in SQL Server te berekenen

  4. Fouten in SQL Server tijdens het importeren van CSV-bestand ondanks dat varchar(MAX) voor elke kolom wordt gebruikt