2013-10-25 4 views
2

행으로 범위를 변환 기반 SQL보기를 만들기 때문에나는 테이블과 같은 구조 한

ColA|ColB|LowRange|HighRange 
---------------------------- 
    1 A  1   5 

나는 다음과 같은 형식

ColA|ColB|RangeNumber 
---------------------- 
    1 A  1 
    1 A  2 
    1 A  3 
    1 A  4 
    1 A  5 

의 데이터를 사용할 수 있도록하는보기를 만들 싶습니다 나는 전망에 익숙하지 않아 어떤 방향이 필요합니다.

감사

+0

"수"에서 오는가를 사용하여이 작업을 수행 할 수 ?? – BWS

+0

낮은 범위에서 높은 범위의 foreach 번호 – Tim

+0

t-sql (또는 다른 언어)으로 코드를 작성해야하지만 원하는대로 수행하려면 SQL보기가 필요합니다. – NoChance

답변

5

당신은 재귀 CTE

CREATE TABLE ranges (
    ColA int, 
    ColB char, 
    LowRange int, 
    HighRange int, 
); 

INSERT INTO ranges 
VALUES (1, 'A', 1, 5), 
(2, 'B', 5, 10); 
GO 

CREATE VIEW range_view 
AS 
WITH each AS 
(
    SELECT ColA, ColB, LowRange AS n, HighRange 
     FROM ranges 
    UNION ALL 
    SELECT ColA, ColB, n + 1, HighRange 
     FROM each 
    WHERE n + 1 <= HighRange 
) 
SELECT ColA, ColB, n 
FROM each 
GO 

SELECT * FROM range_view 
DROP VIEW range_view 
DROP TABLE ranges; 
+0

우수한 솔루션입니다. 나는 그 길로 향했다. 그러나 거기에 도착하는 것은 나를 더 오랫동안 데려 갔을 것이다. 나는 그것을 라이브 테이블에서 구현하고 "최대 재귀"오류가 발생했지만이를 수정하고 매력처럼 작동합니다. 감사합니다 – Tim

+0

@ 팀 - 영구 보조 번호 테이블에 가입 [가능성이 더 나은 수행합니다] (http://stackoverflow.com/questions/10819/sql-auxiliary-table-of-numbers/2663232#2663232) –

1

나는이 일을 알아낼 수있는 유일한 방법은 모든 숫자를 가지고 다음 원래 테이블에 조인 별도의 테이블을 만드는 것입니다. 나는 'allnumbs'라는 테이블을 만들었고 'num'이라는 이름을 가진 단 하나의 열과 1에서 10 사이의 모든 숫자에 대한 레코드를 가지고 있습니다. 그런 다음 여러분은 그것들에 합류합니다.

select cola, colb, b.num from temp a 
join allnumbs b on b.num >= a.lownum and b.num <= a.highnum 

테이블 온도는 사용자가 표시 한 테이블입니다. 희망이 도움이됩니다.