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

Permintaan rekursif untuk menemukan catatan induk

Coba ini:

declare @t table (
 childID int,
 ParentID int,
 level int
)

insert into @t
select 71, 154, 4
union
select 154, 192, 3
union
select 192, 209, 2
union
select 209, 0, 1

Declare @SearchChild int
set @SearchChild=71

  ;with MyCTE as (
      select t1.childID, t1.ParentID , @SearchChild AS searchChild, t1.level
        from @t t1 
        where t1.childID = @SearchChild
      UNION ALL
      select t1.childID, t1.ParentID , c.SearchChild, t1.level
        from @t t1
        inner join MyCTE c on t1.childID=c.ParentID
  )
select top 1 * from MyCTE order by level asc

KELUARAN:

childID     ParentID    searchChild level
----------- ----------- ----------- -----------
209         0           71          1

Saya tidak yakin apa yang Anda cari, tidak ada baris yang memiliki 209 dan 71 bersama-sama? ini adalah yang terbaik yang dapat Anda lakukan. Selain itu, CTE ini bekerja di atas rantai dan bukan di bawah, dan seharusnya bekerja jauh lebih baik pada tabel besar.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah indeks berkerumun harus unik?

  2. SSIS Execute Process Task tergantung dari SQL Server Job, tidak ada kesalahan yang diberikan

  3. Tambahkan kolom ke tabel dengan nilai default sama dengan nilai kolom yang ada

  4. Kesalahan sql pada pembaruan:Pernyataan UPDATE bertentangan dengan batasan FOREIGN KEY

  5. DI MANA DI (array ID)