2012-04-28 3 views
2

Указанные записи в таблице имеют родителей в одной таблице, а родители имеют своих родителей, какой запрос получит мне записи для всех родителей запрошенной записи, при условии, что разные записи могут иметь различное количество родители.SQL-запрос для вложенных записей

Пример: У меня есть идентификатор записи 4 и вы хотите получить все родительские записи (1,2,3). Конечно, я могу получить запись 4, посмотреть, кто является родителем, и пойти на запись 3, посмотреть, кто является родителем, и пойти на запись 2, пока у меня нет родителей, но есть ли один запрос, который может получить меня записи?

Example Table: 
ID | Type | Parent ID 
---------------------------- 
1 |Master| 
2 |Sub 1 | 1 
3 |Sub 2 | 2 
4 |Sub 3 | 3 
5 |Master| 
6 |Sub 1 | 5 
+0

Я не могу получить этот запрос для работы для меня, я получаю NULL. Может ли кто-нибудь переписать этот пример? – pmm

ответ

1

Можно представить иерархию, если вы предполагали фиксированный максимальный уровень глубины. Например, в этом примере я принимаю не более четырех уровней глубины. Без выражений common-table для рекурсивной оценки нет единого средства запроса за пределами этого типа решения или с использованием переменной.

Select T1.Id, T1.Type 
    , Concat(Coalesce(Concat(Cast(T4.Id As char(10)),','),'') 
     , Coalesce(Concat(Cast(T3.Id As char(10)),','),'') 
     , Coalesce(Concat(Cast(T2.Id As char(10)),','),'')) 
     As Hierarchy 
From ExampleTable As T1 
    Left Join ExampleTable As T2 
     On T2.Id = T1.ParentId 
    Left Join ExampleTable As T3 
     On T3.Id = T2.ParentId 
    Left Join ExampleTable As T4 
     On T4.Id = T3.ParentId