2

我在 SQL Server 2000 中有以下树的场景。

有两个表的数据库,形象地说

Table1(Row_Id int,Id char(9)等)

Table2(Row_Id int、Parent_Id char(9)、Parent_Parent_Id char(9)等)。

Parent_IdinTable2指的是Idin Table1

Parent_Parent_Idin也Table2Idin 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“a”的元素Table1没有更多的父元素,并且带有Id“a”的元素的最后一个父元素是“e”。

换句话说,我想用输入参数inId(它是任何Idfrom Table1)编写存储过程,因此我想得到最后一个没有父级的父级。

现在我通过循环来做到这一点

SELECT ... 
FROM Table1 
LEFT JOIN Table2 ON Table1.Id = Table2.Parent_Id 
WHERE Table1.Id = inId

直到我进入NULL正确的位置。

你认为有没有更好的方法来做到这一点?

谢谢你。

4

2 回答 2

1

在 2000 之后的 SQL Server 版本中,有几种方法可以有效地实现这一点。然而,在 SQL 2000 中,您需要手动解决此问题。有两种选择:

  • 递归函数或过程
  • 一个循环

如果循环编写正确,它很可能是两者中较快的。只要确保您在表上有适当的索引。

您也不需要加入 table1。只需在循环中执行类似 的操作SELECT @newParent = Parent_Parent_Id FORM dbo.Table2 WHERE Parent_Id = @currentParent;,如果没有找到新的父级,则停止。

于 2013-02-02T20:39:07.107 回答
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
于 2013-02-03T16:22:26.103 回答