【发布时间】:2009-10-02 11:35:11
【问题描述】:
我有一个父/子关系表,多对多
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?
【问题讨论】:
-
你能举一个表中数据的例子吗,当我看到这个时,CTE 可能导致给定 aboce (e->b) 的数据无限循环,将与 (b-> c)我认为不需要?
-
@astander,它不应该在我的示例中创建一个无限循环,但是它可能会发生,我会在重新创建完整的树后处理它
标签: sql-server-2005 common-table-expression