У меня есть таблица отношений родитель / ребенок, многие ко многим
parentid int not null
childid int not null
допустим, у меня есть компания a, b, c, d, e
a
..b
....c
..c
d
..e
....b
......c
Я получил этот запрос, чтобы вернуть одного старшего родителя
FUNCTION [dbo].[getRootCompagny]
(
@root int
)
RETURNS int
AS
BEGIN
DECLARE @parent int
SELECT @parent = companyparentid from companyrelation where companychildid = @root
if @parent is not null
set @root = dbo.getRootCompagny(@parent)
RETURN @root
END
Если я пройду b, я получу только
a
..b
....c
..c
потому что запрос, который я написал, может управлять только одним верхним родителем.
Как бы вы исправили это, чтобы иметь возможность получить целое дерево, как первое?
вот мой CTE
PROCEDURE [dbo].[GetCompanyRelation]
@root int
AS
BEGIN
SET NOCOUNT ON;
set @root = dbo.getRootCompagny(@root)
WITH cieCTE(CompanyChildid, CompanyParentid, depth, sortcol)
AS
(
-- root member
SELECT @root
, null
, 0
, CAST(@root AS VARBINARY(900))
UNION ALL
-- recursive member
SELECT R.CompanyChildid
, R.CompanyParentid
, C.depth+1
, CAST(sortcol + CAST(R.CompanyChildid AS BINARY(4)) AS VARBINARY(900))
FROM CompanyRelation AS R JOIN cieCTE AS C ON R.CompanyParentid = C.CompanyChildid
)
-- outer query
SELECT cieCTE.depth
, cieCTE.CompanyChildid as ChildID
, cieCTE.CompanyParentid as ParentId
, company.[name] as [Name]
FROM cieCTE inner join company on cieCTE.CompanyChildid = company.companyid
ORDER BY sortcol
END
в конце, с логикой выше, я получаю a, как получить a, d?