我在SQL Server 2000中有一个树的以下场景。
有数据库有两个表,比喻说
Table1
(Row_Id int ,Id char(9)等)
AND
Table2
(Row_Id int ,Parent_Id char(9),Parent_Parent_Id char(9)等。)
Parent_Id
中的{p> Table2
引用Id
中的Table1
。
Parent_Parent_Id
中的{p> Table2
也指Id
中的Table1
(因此,孩子可以拥有多个父母)。
例如,让我们考虑包含一些数据的表:
表1
Row_Id Id
1 a
2 b
3 c
4 d
5 e
6 ...
表2
Row_Id Parent_Id Parent_Parent_Id
1 a b
2 b с
3 c d
4 d e
5 ... ...
这个包含数据的方案显示来自Id
的{{1}}'a'元素没有父母,而Table1
'a'元素的最后一个父元素是'e' 。
换句话说我想用输入参数Id
编写存储过程(来自inId
的任何Id
),结果我想得到最后一个没有父母的父母。
现在我通过
循环执行此操作Table1
直到我在右侧获得SELECT ...
FROM Table1
LEFT JOIN Table2 ON Table1.Id = Table2.Parent_Id
WHERE Table1.Id = inId
。
您认为有什么更好的方法吗?
谢谢。
答案 0 :(得分:1)
在2000之后的SQL Server版本中,有几种方法可以有效地实现此目的。但是,在SQL 2000中,您可以手动解析此问题。有两种选择:
如果循环写得正确,那么它很可能会更快。只需确保表上有适当的索引。
您也不需要加入table1。只需在循环中执行类似SELECT @newParent = Parent_Parent_Id FORM dbo.Table2 WHERE Parent_Id = @currentParent;
的操作,如果没有找到新的父项,则停止。
答案 1 :(得分:0)
我写了循环,这已经决定了我的问题。谢谢。
USE MyDatabase
GO
DECLARE @currentParent char(9),
@newParent char(9)
SELECT @currentParent = 'a',
@newParent = @currentParent
WHILE (1 = 1)
BEGIN
SELECT @newParent = Parent_Parent_Id
FROM Table2
WHERE Parent_Id = @currentParent;
IF (@newParent = @currentParent)
BEGIN
PRINT @newParent;
BREAK;
END;
SELECT @currentParent = @newParent;
END