获取 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
谓词检测到这一点)。
尝试:
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
我正在升级遗留应用程序,我需要查找 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
:
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
谓词检测到这一点)。
尝试:
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