4

在 SQL Server 2005 中得到了这张表,用于维护合并操作的历史记录:

  • FROM_ID 列(整数)
  • 列 TO_ID (int)

现在我需要一个以原始 FROM_ID 作为输入的查询,并返回最后一个可用的 TO_ID。

例如:

  • ID 1 合并到 ID 2
  • 稍后,ID 2 合并到 ID 3
  • 稍后再将 ID 3 合并到 ID 4

所以我试图放在一起的查询将作为输入(在我假设的 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 回答