2012-12-13 2 views
0

두 개의 열이있는 테이블이 있습니다. 내가 할 수 있도록하고 싶습니다 무엇Sql 서버 재귀

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로 유지하기 위해 정기적으로이 작업을 수행해야합니다.

답변

1

시도해보십시오. SQL Fiddle

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

이것은 최종 답변과 같습니다. 내 기본 테스트가이 사실을 입증하는 것 같습니다. 나는 모든 수퍼 세션을 통해 하나의 번호를 따를 수 있습니다. – Stormflurry

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 

원한다면이 결과를 표에 삽입 할 수 있습니다.

+0

이 솔루션은 너무 단순해서 내 마음을 아프게합니다. 고맙습니다. 그냥 테스트하고 데이터가 정확하고 빠르게 나타납니다! – Stormflurry

+0

@Stormflurry,이 쿼리는 결과가 CURRENTNUMBER 12346 OLDNUMBER 12345와 다를 것으로 예상됩니다. CURRENTNUMBER 12347 OLDNUMBER 12345 – EricZ

+0

한 가지 문제가있는 것으로 보입니다. 새 번호 zig가 이전 번호를 통해 zags라고 말하십시오. 그래서 위의 예는 현재 번호가 12347이며 12346을 초과했으며 12345를 초과했습니다.이 시나리오는이 예제에서 다루지 않는 것으로 보입니다. – Stormflurry