sql >> Databasteknik >  >> RDS >> Sqlserver

Rekursiv fråga för att hitta den överordnade posten

Prova detta:

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

UTGÅNG:

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

Jag är inte säker på vad du är ute efter, det finns ingen rad som har 209 och 71 tillsammans? det här är det bästa du kan göra. Dessutom fungerar denna CTE uppåt i kedjan och inte neråt, och borde fungera mycket bättre på stora bord.



  1. där villkor från en kommaseparerad varchar i mysql och codeigniter

  2. Varför fungerar inte mitt säkerhetskopieringsskript för databas i php?

  3. MYSQL-fråga för att få datumskillnad

  4. Oracle-tabellkolumnnamn med mellanslag