0

我有一个表,其中有一个看起来像这样的列表

参考

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) 引用,所以现在我们需要找到 Report name B,Line No 23.1,我们继续迭代,除非我们在同一个表,这意味着我们找不到的最后一个表在另一个表中有值。(此表中仅找到没有值的引用) ...请看下表

表:生成的值

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。

像这样我们一个一个地浏览每条记录。

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

侯赛因

4

1 回答 1

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 在任何情况下都会对您有用。

于 2009-11-23T08:12:36.680 回答