2010-09-14 86 views
3

得到了在SQL Server 2005中,这是用来维持合并操作的历史记录此表:查找单表链(SQL Server)的最后一个记录

  • 列FROM_ID(INT)
  • 列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

使用CTE会工作。

Testscript

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   
+0

经过测试,几乎在那里,除了MAX(ToID)将不起作用,因为合并的目标ID并不总是大于同一链中的先前目标ID ...所以ID 1可以合并为3,然后3可以合并为2,例如 – tjeuten 2010-09-14 15:00:22

+0

可以通过向合并信息添加时间戳并选择“按日期排序的前1个顺序”方法来解决此问题。但想知道是否可以不加时间戳 – tjeuten 2010-09-14 15:09:48

3

如果这对你的作品给利芬接受的答案,因为它是基于他的代码。

;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 
+0

是的,先生,谢谢,它使它工作!谢谢你们俩 ! – tjeuten 2010-09-14 15:37:34

+0

谢谢马丁。 – 2010-09-14 18:32:43

相关问题