获取 parents 的总数

Get total number of parents

我正在升级遗留应用程序,我需要查找 table 中某些行的 parent 数量。

我正在考虑为此使用已声明的过程,但我无法弄清楚如何让它发挥作用。

基本上你有一个带有 id 和 parent

的 table
= id = parent =
= 0  = 0 =
= 1  = 0 =
= 2  = 1 =
= 3  = 1 =
= 4  = 2 =

ID 是唯一的,而 parent 是可变的,具体取决于用于创建该条目的内容,但它将始终匹配具有匹配 ID

的行

我想要实现的是调用一个过程,该过程 return 所有匹配的 parent 数字作为一个简单的可迭代结果集。

所以如果我要执行 getAllParents(4) 它应该 return me 2, 1, 0

我失败的循环尝试让我走到这一步

CREATE PROCEDURE getNumberOfParents @start int  @current int 
as
begin
SELECT parent FROM test where id=@start
if(parent > 0)
   begin
      set @current = @current + 1;
      set @current = @current + getNumberOfParents(parent,@current);
   end
end

由于限制我不能使用额外的 table 来实现这个,否则我会很容易嘿。但是我可以制作 temptables 可以在方法退出后清理。

尝试使用本例中所示的 while 循环: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of-while-loop-with-continue-and-break-keywords/

您可以通过使用递归 CTE:

而无需 while 循环
DECLARE @lookupId INT = 4

;WITH ParentsCTE AS (
   SELECT id, parent
   FROM #mytable
   WHERE id = @lookupId

   UNION ALL

   SELECT m.id, m.parent
   FROM #mytable AS m
   INNER JOIN ParentsCTE AS p ON m.id = p.parent
   WHERE m.id <> m.parent
)
SELECT parent
FROM ParentsCTE 

以上主播成员CTE:

SELECT id, parent
FROM #mytable
WHERE id = @lookupId

returns 'lookup id' 的 直系父级

递归成员:

SELECT m.id, m.parent
FROM #mytable AS m
INNER JOIN ParentsCTE AS p ON m.id = p.parent
WHERE m.id <> m.parent

不断在层次结构中添加父节点,直到达到 根节点m.id <> m.parent 谓词检测到这一点)。

SQL Fiddle Demo

Fiddle Demo Here

尝试:

declare @id varchar(max)=''
declare @getid int=4
while @getid>0

begin
select @id=@id+cast(parent as varchar(10))+',' from tab_1
where id=@getid
select @getid=parent from tab_1 where id=@getid
end

select @id

测试数据

DECLARE @Table TABLE (id INT, parent INT)
INSERT INTO @Table VALUES 
 (0 ,  0), 
 (1 ,  0), 
 (2 ,  1),
 (3 ,  1), 
 (4 ,  2) 

查询

 -- Id you want all the parents for 
 DECLARE @ParentsFor INT = 4

;with parents as 
(
  select ID, parent
  from @Table
  where parent IS NOT NULL
  union all 
  select p.ID, t.parent
  from parents p
    inner join @Table t on p.parent = t.ID
      and t.ID <> t.parent
)
select Distinct
       STUFF((SELECT ',' + Cast(parent AS VarChar(10))
             FROM parents
             WHERE ID = @ParentsFor
             FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,'')
FROM parents

结果

2,1,0

SQL FIDDLE