Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL đệ quy CTE:Tìm các đối tượng được liên kết bởi thuộc tính

Bạn đang gặp phải một vòng lặp vô hạn gây ra bởi các chu kỳ trong dữ liệu của bạn, ví dụ:1> 2> 3> 2> .... Giải pháp là theo dõi các hàng đã được "tiêu thụ". Do những hạn chế trong CTE, điều này phải được thực hiện bằng cách bao gồm lịch sử trong mỗi hàng CTE, ví dụ:bằng cách tập hợp đường dẫn theo sau để đến từng hàng. Bạn có thể bỏ ghi chú , Path trên select cuối cùng để xem chuyện gì đang xảy ra.

-- 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. Làm cách nào để có được một danh sách các từ riêng biệt được sử dụng trong tất cả các Bản ghi Trường bằng MS SQL?

  2. Không thể đăng nhập vào SQL Server + Xác thực SQL Server + Lỗi:18456

  3. Tại sao SQL Server tự động bỏ qua khoảng trống ở cuối?

  4. Làm cách nào để liệt kê các phiên bản sẵn có của Máy chủ SQL sử dụng SMO trong C #?

  5. Cách chọn JSON lồng nhau trong SQL Server với OPENJSON