Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Parent-child запрос c Root_Parent_child  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1226
Добрый день всем.

Есть станд. иерархическая таблица.
Есть много рутов в иеррахиии ( 1,2 ,3 ,4 ... ) c Parent_Org_Id == Null

Запрос раскручивающий есть и понятен.
Надо достать еще одно поле родителя верхней иерархии - т.е все записи долждны остаться
+ новое поле Root_Parent_child

2 - корневая
201 , 202
2010, 2011 , 2020 , 2021
20101, ...

т.е для всех последних трех строк надо достать 2 - как Root Parent

Не могу сообразить как это сделать
Желательно красиво в одном запрос но можно и с Temp таблицами

CREATE TABLE dwh.DimOrganization(
	Org_Id int  NOT NULL, -- IDENTITY(1,1)
	Parent_Org_Id int NULL,
	Src_Org_ID uniqueidentifier NOT NULL,
	Org_Name nvarchar(500) NOT NULL,
	Org_level tinyint  NOT NULL,
,CONSTRAINT PK_DimOrganization PRIMARY KEY    (	Org_Id  )
)

With CTE
AS
(
SELECT Org_Id,Parent_Org_Id,Org_Name, 1 AS level,CAST(Org_Name AS varchar(max)) AS Org_Path
FROM dwh.DimOrganization 
WHERE 
Parent_Org_Id is Null --  Roots Org_Id = Parent_Org_Id 
UNION ALL
SELECT e.Org_Id,e.Parent_Org_Id,e.Org_Name,c.Level + 1
, CAST(c.Org_Path + '/' + e.Org_Name AS varchar(max))
FROM CTE c
INNER JOIN dwh.DimOrganization  e
	ON e.Parent_Org_Id = c.Org_Id 
WHERE 
1=1 -- e.Parent_Org_Id <> e.Org_Id
AND c.level < 5 -- THIS PREVENTS THE RECURSION FROM RUNNING
)
Select * From CTE
ORDER BY level , Org_Id
20 мар 19, 11:57    [21838273]     Ответить | Цитировать Сообщить модератору
 Re: Parent-child запрос c Root_Parent_child  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 641
Гулин Федор,

With CTE
AS
(
SELECT Org_Id AS Root, Org_Id,Parent_Org_Id,Org_Name, 1 AS level,CAST(Org_Name AS varchar(max)) AS Org_Path
FROM dwh.DimOrganization 
WHERE 
Parent_Org_Id is Null --  Roots Org_Id = Parent_Org_Id 
UNION ALL
SELECT c.Org_Id AS Root, e.Org_Id,e.Parent_Org_Id,e.Org_Name,c.Level + 1
, CAST(c.Org_Path + '/' + e.Org_Name AS varchar(max))
FROM CTE c
INNER JOIN dwh.DimOrganization  e
	ON e.Parent_Org_Id = c.Org_Id 
WHERE 
1=1 -- e.Parent_Org_Id <> e.Org_Id
AND c.level < 5 -- THIS PREVENTS THE RECURSION FROM RUNNING
)
Select * From CTE
ORDER BY level , Org_Id
20 мар 19, 14:12    [21838505]     Ответить | Цитировать Сообщить модератору
 Re: Parent-child запрос c Root_Parent_child  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1226
Guf,

Root Org_Id Parent_Org_Id
1 1 NULL
2 2 NULL
1 101 1
1 102 1
2 201 2
2 202 2

ниже не так
202 2002 202
202 2003 202
201 2010 201
201 2011 201
201 2012 201
2010 100000 2010
2010 100001 2010
2010 100002 2010

Root == Parent_Org_Id - что вобщем видно из кода
А мне надо чтобы в нижнем куске в Root == 2
т.е как-то раскрутить чайлды вверх до root 2
20 мар 19, 14:24    [21838516]     Ответить | Цитировать Сообщить модератору
 Re: Parent-child запрос c Root_Parent_child  [new]
court
Member

Откуда:
Сообщений: 1986
With CTE
AS
(
SELECT Org_Id AS Root, Org_Id,Parent_Org_Id,Org_Name, 1 AS level,CAST(Org_Name AS varchar(max)) AS Org_Path
FROM dwh.DimOrganization 
WHERE 
Parent_Org_Id is Null --  Roots Org_Id = Parent_Org_Id 
UNION ALL
SELECT c.Root, e.Org_Id,e.Parent_Org_Id,e.Org_Name,c.Level + 1
, CAST(c.Org_Path + '/' + e.Org_Name AS varchar(max))
FROM CTE c
INNER JOIN dwh.DimOrganization  e
	ON e.Parent_Org_Id = c.Org_Id 
WHERE 
1=1 -- e.Parent_Org_Id <> e.Org_Id
AND c.level < 5 -- THIS PREVENTS THE RECURSION FROM RUNNING
)
Select * From CTE
ORDER BY level , Org_Id

так, чтоле ?
20 мар 19, 15:26    [21838617]     Ответить | Цитировать Сообщить модератору
 Re: Parent-child запрос c Root_Parent_child  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1226
court,
+1
результат правильный
СПС и Guf

сижу думаю вот элементарно вроде а фиг
все просто когда знаешь
20 мар 19, 16:12    [21838692]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить