4

SQL Server 2005で次のテーブルを取得しました。これは、マージ操作の履歴を維持するために使用されます。

  • 列FROM_ID(int)
  • 列TO_ID(int)

ここで、元のFROM_IDを入力として受け取り、最後に使用可能なTO_IDを返すクエリが必要です。

たとえば、次のようになります。

  • ID1はID2にマージされます
  • その後、ID2はID3にマージされます
  • 後で再び、ID3はID4にマージされます

したがって、私がまとめようとしているクエリは、入力として(WHERE句で)ID 1を受け取り、結果として最後に使用可能なTO_ID(この場合は4)を取得する必要があります。

再帰ロジックが必要だと思いますが、どのように始めればよいのかよくわかりません。

ありがとう !

マシュー

4

2 に答える 2

6

CTEを使用すると機能します。

テストスクリプト

DECLARE @IDs TABLE (
  FromID INTEGER
  , ToID INTEGER
)

INSERT INTO @IDs
SELECT           1, 2 
UNION ALL SELECT 2, 3
UNION ALL SELECT 3, 4

SQLステートメント

;WITH q AS (
    SELECT  FromID, ToID
    FROM    @IDs
    UNION ALL 
    SELECT  q.FromID, u.ToID
    FROM    q
            INNER JOIN @IDs u ON u.FromID = q.ToID
)
SELECT  FromID, MAX(ToID)
FROM    q
WHERE   FromID = 1
GROUP BY
        FromID           
于 2010-09-14T14:17:43.050 に答える
3

これがうまくいくなら、それは彼のコードに基づいているので、Lievenに受け入れられた答えを与えてください。

;WITH q AS (
    SELECT  1 AS LEVEL, FromID, ToID
    FROM    @IDs
    WHERE FromID=1
    UNION ALL 
    SELECT  LEVEL + 1, q.FromID, u.ToID
    FROM    q
            INNER JOIN @IDs u ON u.FromID = q.ToID
)

SELECT TOP 1 ToID
 FROM q
ORDER BY LEVEL DESC
于 2010-09-14T15:30:36.583 に答える