Sql server 在SQL Server 2000中,对于以下场景,如何从表中获取最后一个父级?
我在SQLServer2000中有一个树的以下场景 打个比方说,数据库有两个表Sql server 在SQL Server 2000中,对于以下场景,如何从表中获取最后一个父级?,sql-server,tsql,tree,sql-server-2000,Sql Server,Tsql,Tree,Sql Server 2000,我在SQLServer2000中有一个树的以下场景 打个比方说,数据库有两个表 表1(行Id int、Id char(9)等) 及 表2(行Id int、父Id字符(9)、父Id字符(9)等) Table2中的Parent\u Id指Table1中的Id Table2中的Parent\u Parent\u Id也指Table1中的Id(因此子项可以有多个父项) 例如,让我们考虑表中的一些数据: 表1 Row_Id Id 1 a 2 b 3 c
表1
(行Id int、Id char(9)等)
及
表2
(行Id int、父Id字符(9)、父Id字符(9)等)
Table2
中的Parent\u Id
指Table1
中的Id
Table2
中的Parent\u Parent\u Id
也指Table1
中的Id
(因此子项可以有多个父项)
例如,让我们考虑表中的一些数据:
表1Row_Id Id
1 a
2 b
3 c
4 d
5 e
6 ...
Row_Id Parent_Id Parent_Parent_Id
1 a b
2 b с
3 c d
4 d e
5 ... ...
表2
Row_Id Id
1 a
2 b
3 c
4 d
5 e
6 ...
Row_Id Parent_Id Parent_Parent_Id
1 a b
2 b с
3 c d
4 d e
5 ... ...
此数据场景显示table 1
中Id为a的元素不再有父元素,Id为a的元素的最后一个父元素是“e”
换句话说,我想用输入参数inId
(它是Table1
中的任何Id
)编写存储过程,因此我想得到最后一个没有父对象的父对象
现在我通过循环和
SELECT ...
FROM Table1
LEFT JOIN Table2 ON Table1.Id = Table2.Parent_Id
WHERE Table1.Id = inId
直到我在右边得到NULL
你认为有什么更好的方法吗
谢谢。在2000年以后的SQL Server版本中,有几种方法可以有效地实现这一点。但是,在SQL 2000中,您需要手动解决此问题。有两种选择:
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
- 递归函数或过程
- 环路
如果循环写入正确,则很可能是两个循环中速度较快的一个。只需确保表上有适当的索引即可
您也不需要加入表1。只需执行类似于的操作,从dbo.Table2中选择@newParent=Parent\u Parent\u Id,其中Parent\u Id=@currentParent在循环中编码>,如果没有找到新的父级,则停止。我已经编写了循环,这决定了我的问题。多谢各位
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
最后一位家长,他没有更多的孩子我想应该是最后一位家长,他没有更多的父母。在您的示例中,e
是最后一个没有更多父项的父项。