2013-09-26 2 views
0

Я следующий DB схемыРодитель Дети T-SQL Query

Местоположение Таблица

LocationID LocationName 
1   | L1 
2   | L2 
.   | L3 
.   | L4 
.   | L5 
n   | Ln 

и другая таблица, которая определяет ребенка отношения родителя и схема является

ID LocationID ParentID 
1  1   null 
2  2   1 
3  3   1 
4  4   2 

и так на.

Я хочу передать идентификатор или несколько идентификаторов элементов на любом уровне, и запрос возвращает все дочерние элементы (-и).

+0

Кажется случай для [рекурсивной КТР] (http://stackoverflow.com/questions/13933255/recursive-sql- сервер-запрос) – cdoubleplusgood

+0

да. он должен быть рекурсивным CTE. –

+0

Вам нужны все дети на всех уровнях или только прямые потомки? Потому что во втором случае я думаю, что вам не нужно использовать CTE. – DrCopyPaste

ответ

1
select l.LocationID,l.LocationName,m.LocationID AS Child,l1.LocationName AS ChildName 
from Location l 
inner join mappingtable m 
ON l.LocationID=m.ParentID 
inner join Location l1 
ON l1.LocationID=m.LocationID 

SQL FIDDLE DEMO

+0

Спасибо за ответ, но как это вернет результат, который я ищу? –

+0

Извините, непонятый вопрос. Обновлен ответ. Это то, что вы ищете? – dcp1986

+0

Спасибо за сообщение. Возможно ли предоставить идентификаторы или идентификаторы, чтобы я мог находить дочерние элементы элемента на любом уровне. Поэтому, если я передаю идентификатор самого верхнего корня, он дает мне все его дочерние элементы, если я передаю идентификатор элемента, говорят на уровне 3 он дает моим детям на уровне 4 и так далее? –

1
declare @relation table(ID int, LocationID int, ParentID int) 
insert @relation values 
(1,1,null),(2,2,1),(3,3,1),(4,4,2) 

declare @Location table (LocationID int, LocationName varchar(3)) 
insert @Location values 
(1,'L1'),(2,'L2'),(3,'L3'),(4,'L4'),(5,'L5'),(6,'L6') 

;with a as 
(
select ID p, ID, LocationID, ParentID from @relation where parentid is null 
union all 
select a.p, t.ID, t.LocationID, t.ParentID 
from a join @relation t 
on a.ID = t.ParentID 
) 
select L1.LocationID ParentID, L1.LocationName ParentName, L2.LocationID, L2.LocationName from a 
join @Location L1 
on a.p = L1.LocationID 
join @Location L2 
on a.id = L2.LocationID 
option (maxrecursion 500) 

Результат:

ParentID ParentName LocationID LocationName 
1   L1   1   L1 
1   L1   2   L2 
1   L1   3   L3 
1   L1   4   L4 
Смежные вопросы