如何在SQL Server 2000中编写递归查询

时间:2009-11-23 07:20:54

标签: sql-server-2000 recursive-query

我有一个表格,其中有一个类似于此的列表

参考

R. Name    LineNo.       References
  A         1.1           (B,24.1)
  A         6.3           (A, 1.3), (D, 22.1)
  B         23.1          (A. 1.2)
  B         24.1          (B,23.1)
  C         2             (A, 1.1)
  D         3.12          (A, 6.3)

查询应该在记录中逐个进行,并根据引用生成一个值,首先选择一个,即报告名称A,行号1.1,现在引用是(B,24.1),其中意味着我们需要找到报告名称B,第24.1行并选择其值。在同一个表中,R.Name B和Line No B,24.1由(B,23.1)引用,所以现在我们需要找到报告名称B,行号23.1,我们继续进行迭代,除非我们找不到引用同一个表,这意味着我们找不到的最后一个表在另一个表中有一个值。 (此表中仅找到没有值的引用)...请查看下表

表格: GeneratedValues

R.Name  LineNo.    Values
----------------------------------------
A       1.2          5632
A       1.3          12.5
A       2.1          25
A       2.2          121
A       2.3          8

现在A,1.1参考文献B,24.1哪些参考文献B,23.1哪些参考文献A,1.2并且由于A,1.2不存在于参考表中,另一个查询运行并从“生成的值”表中获取数字。在这种情况下,5632,因此A,1.1 = 5632。

像这样,我们逐一通过每条记录。

我的问题是我不知道如何编写递归查询来实现它。

侯赛因

1 个答案:

答案 0 :(得分:1)

让我们把它分解。

首先,UDF获取下一个'值'

CREATE FUNCTION dbo.GetNextReference
(
    @CurrentRef varchar(25)
)
RETURNS varchar(25)
AS
BEGIN
    DECLARE @NextRef varchar(25)
    SELECT @NextRef = [References]
    FROM R
    WHERE '(' + [Name] + ',' + [LineNo] + ')' = @CurrentRef

    RETURN @NextRef
END

接下来查找每个条目的最终值:

CREATE FUNCTION dbo.GetFinalReference
(
    @StartRef varchar(25)
)
RETURNS varchar(25)
AS
BEGIN
    DECLARE @NextRef varchar(25), @CurrentRef varchar(25)
    SELECT @NextRef = dbo.GetNextReference(@StartRef), @CurrentRef = @StartRef
    WHILE @NextRef is not null
    BEGIN
        SET @CurrentRef = @NextRef
        SET @NextRef = dbo.GetNextReference(@CurrentRef)
    END

    --at this point @NextRef will be null, so we look in the other table
    DECLARE @FinalValue varchar(25)
    SELECT @FinalValue = [Values]
    FROM GeneratedValues
    WHERE '(' + [Name] + ',' + [LineNo] + ')' = @CurrentRef

    RETURN @FinalValue
END

最后,我们可以运行SELECT

SELECT [Name], [LineNo], dbo.GetFinalReference([References]) AS [Values]
FROM R

我希望这一切都清楚,我没有做出任何语法错误。使用UDF可能意味着此查询不会像您希望的那样快速运行,但我认为UDF在任何情况下都对您有用。