Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Рекурсивна заявка за намиране на родителския запис

Опитайте това:

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

ИЗХОД:

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

Не съм сигурен какво търсите, няма ред, който да съдържа 209 и 71 заедно? това е най-доброто, което можете да направите. Освен това този CTE работи нагоре по веригата, а не надолу, и трябва да работи много по-добре на големи маси.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Възможно ли е принудително заключване на ниво ред в SQL Server?

  2. Създаване на таблица с помощта на явен оператор create table срещу select into

  3. Присвояването на входни параметри на съхранена процедура към локални променливи помага ли за оптимизиране на заявката?

  4. ODBC неуспешно повикване със съхранена процедура - Преминаване през заявка

  5. SQL заявка за получаване на данни за последните 3 месеца