Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Rekurencyjne zapytanie w celu znalezienia rekordu nadrzędnego

Spróbuj tego:

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

WYJŚCIE:

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

Nie jestem pewien, czego szukasz, nie ma wiersza, który ma 209 i 71 razem? to najlepsze, co możesz zrobić. Ponadto ten CTE działa w górę łańcucha, a nie w dół, i powinien działać znacznie lepiej na dużych stołach.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zamiana określonego znaku w adresach e-mail na „*” w zapytaniu SQL

  2. Czy mogę włączyć ignorowanie_dup_key dla klucza podstawowego?

  3. Sumy częściowe i SQL

  4. Nie można rzutować obiektu COM typu „System.__ComObject” na typ interfejsu „Microsoft.VisualStudio.OLE.Interop.IServiceProvider”

  5. Zwróć ostatnio wprowadzony identyfikator bez użycia drugiego zapytania