Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Recursive CTE:Menemukan objek yang ditautkan oleh properti

Anda mengalami infinite loop yang disebabkan oleh siklus dalam data Anda, mis.:1> 2> 3> 2> ... . Solusinya adalah melacak baris yang sudah "dikonsumsi". Karena keterbatasan dalam CTE, ini harus dilakukan dengan memasukkan riwayat dalam setiap baris CTE, mis. dengan merakit jalur yang diikuti untuk sampai pada setiap baris. Anda dapat menghapus komentar pada , Path pada select terakhir untuk melihat apa yang terjadi.

-- 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masukkan Gambar ke dalam Bidang Gambar SQL Server 2005 hanya menggunakan SQL

  2. Hitung Total Biaya Kepemilikan Pemantauan SQL Server Anda

  3. Pemformatan Tanggal/Waktu Kustom di SQL Server

  4. sql cross join - apa gunanya ada yang menemukannya?

  5. Periksa apakah ada baris, jika tidak masukkan