如何从表中获取SQL Server 2000中以下方案的最后一个父级?

时间:2013-02-02 10:01:42

标签: sql-server tsql tree sql-server-2000

我在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

您认为有什么更好的方法吗?

谢谢。

2 个答案:

答案 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