如果你确切地知道你的数据结构有多深,你可以手动写出代码:
DECLARE
@parentId1 int
,@parentId2 int
...
,@parentId19 int
,@parentId20 int
SELECT
@parentId1 = parent_id
FROM
myTable
WHERE
group_id = <someid>
SELECT
@parentId2 = parent_id
FROM
myTable
WHERE
group_id = @parentId1
等等。然而,这会给你一大堆额外的代码,并且不会比循环更好,而且它非常脆弱。向树中添加新级别需要您修改代码,这应该是即时的代码味道。
用任何其他语言来考虑它。您必须总共执行任务 X N 次,其中 N 是可变的。你打算怎么写这个?你会使用一个循环。现在假设您的数据结构是一棵树(这就是您在这里得到的)。你会怎么写这个?您可能会使用递归,除非您将递归扁平化为循环。
唯一针对 MSSQL 的警告是,默认情况下,递归堆栈的深度限制为 16。在 MSSQL 中使用循环比使用递归要好得多。
我通常会做这样的事情:
-- Temp table will hold the results starting from the ID of the source item
-- through all its ancestors in ascending order
DECLARE @table TABLE (
sequence int IDENTITY(1, 1)
,group_id int
)
DECLARE @groupId int
SELECT @groupId = <someid>
-- Loop backwards through the group's hierarchy inserting all parent IDs
-- into the temporary table
WHILE @groupId IS NOT NULL
BEGIN
INSERT INTO @table (
group_id
)
VALUES (
@groupId
)
-- Get the ID of the group's parent ready to loop again
SELECT @groupId = parent_id
FROM mutable
WHERE group_id = @groupId
END
-- Print the results
SELECT group_id
FROM @table
可能有更好的方法,但这将以一种您可以轻松操作的形式为您提供所有 ID,而且它们的顺序正确。