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)

クエリはレコードを 1 つずつ実行し、参照に基づいて値を生成する必要があります。最初の 1 つを選択します。たとえば、レポート名 A、行番号 1.1 です。参照は (B, 24.1) です。これは、必要なことを意味します。レポート名 B の 24.1 行目を見つけて、その値を選択します。同じテーブル R.名前 B と行番号 B, 24.1 は (B, 23.1) によって参照されています. では, レポート名 B, 行番号 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 です。

このように、各レコードを 1 つずつ調べていきます。

私の問題は、これを実装するために再帰クエリを作成する方法がわからないことです。

フセイン

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 に答える