0

我有一张桌子,它有两列。

CurrentNumber | NewNumber
12345 | 12346
12346 | 12347
12347 | NULL
12349 | NULL
12350 | 12351
12351 | NULL

我想做的就是将这个视图展平如下。创建一个新表

CurrentNumber | OldNumber
12347 | 12346
12347 | 12345
12351 | 12350

这是我的问题。我可以使用一些嵌套游标来查找可能存在的递归数,但我无法想出一种方法来将旧数字找到无穷大。任何帮助,将不胜感激。

我有 Sql Server 2008、2012 或 MySql 服务器可用于尝试解决此问题。我也可以编写一个外部应用程序来潜在地执行此操作,但我必须定期执行此操作,因此如果可能的话,我宁愿将其保留在 SQL 中。

4

2 回答 2

1

试试这个。SQL小提琴

CREATE TABLE t
    ([CurrentNumber] int, [NewNumber] int)
;

INSERT INTO t
    ([CurrentNumber], [NewNumber])
VALUES
    (12345, 12346),
    (12346, 12347),
    (12347, NULL),
    (12349, NULL),
    (12350, 12351),
    (12351, NULL)
;

;WITH cte AS (
  SELECT [CurrentNumber], CAST(NULL AS INT) AS OldNumber
  FROM t
  WHERE NewNumber IS NULL
  UNION ALL
  SELECT c.CurrentNumber, t.CurrentNumber AS OldNumber
  FROM t
  INNER JOIN cte c
      ON (ISNULL(c. OldNumber,c.CurrentNumber) = t.NewNumber)
)
SELECT * 
FROM cte
WHere OldNumber IS NOT NULL
ORDER BY 1,2    
于 2012-12-13T19:02:42.637 回答
0

那是你要的吗 ?

;with cte as
            (
              select * 
              from table 
              where NewNumber is not null 
            ),
       cte2 as 
            (
               select NewNumber CurrentNumber, CurrentNumber OldNumber 
               from cte 
            )

 select * from cte2 order by CurrentNumber

如果需要,您可以将这些结果插入到表中。

于 2012-12-13T18:30:36.737 回答