Sql server 在SQL Server 2000中,对于以下场景,如何从表中获取最后一个父级?

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

我在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  
  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
是最后一个没有更多父项的父项。