2013-10-25 72 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

@Tim - 加入一個永久的輔助數字表[雖然可能會更好](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 

表溫度是你的表,你的顯示。希望這可以幫助。