2016-06-10 8 views
0

Ich versuche, ein Skript zu schreiben, die zwei verschiedene Felder nimmt und listet heraus, was die Werte zwischen ihnen wären IeErweiterung aus einer Liste von Vollbereichen zwischen zwei Feldern

ID|Start#|End# 
1 |1  |5 
2 |6  |8 
3 |9  |10 

als

Anzeige würde
ID |FullRange 
1 |1 
1 |2 
1 |3 
1 |4 
1 |5 
2 |6 
2 |7 
2 |8 
3 |9 
3 |10 
+0

Bitte zeigen Sie uns Ihre besten versuchen. –

+0

Erstellen Sie eine Speicher-Voreinstellung oder Tabellenfunktion, die die beiden Werte und innerhalb der Funktion erhalten bauen ein WHILE LOOP, um jeden Wert in eine Tabellenvariable einzufügen, und wählen Sie später alle Datensätze in der Tabelle eingefügt Variable – Byron

+0

@Byron Während das wäre eine Möglichkeit zu mach es, ich würde es nicht empfehlen. Die Verwendung einer "CURSOR" - oder "WHILE" -Schleife sollte vermieden werden, wenn dies satzbasiert geschehen kann. –

Antwort

0

können Sie rekursive, dies zu tun.

WITH cte ([ID], [END#], FullRange) 
AS 
(
-- Anchor member definition 
SELECT ee.[ID] 
,ee.[END#] 
,ee.[START#] as FullRange 
FROM [master].[dbo].[test] ee 
where ee.[START#] < ee.[END#] 
UNION ALL 

-- Recursive member definition 
SELECT e.[ID] 
,e.[END#] 
,FullRange +1 
FROM [master].[dbo].[test] e inner join cte 
on e.id = cte.id and FullRange +1 <= cte.END# 
) 
-- Statement that executes the CTE 
SELECT ID,FullRange 
FROM cte 
ORDER BY ID 

Ergebnis ist wie folgt:

ID FullRange 
1 1 
1 2 
1 3 
1 4 
1 5 
2 6 
2 7 
2 8 
3 9 
3 10 
0

können Sie eine Tally Table verwenden Zahl von [Start#] zu [End#] generieren:

WITH E1(N) AS(-- 10^1 = 10 rows 
    SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N) 
), 
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10^2 = 100 rows 
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10^4 = 10,000 rows 
CteTally(N) AS(
    SELECT TOP(SELECT MAX([End#] - [Start#]) + 1 FROM Tbl) 
     ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) - 1 
    FROM E4 
) 
SELECT 
    t.ID, 
    FullRange = t.[Start#] + ct.N 
FROM Tbl t 
CROSS JOIN CteTally ct 
WHERE t.[Start#] + ct.N <= t.[End#] 
ORDER BY t.ID, FullRange 

ONLINE DEMO

0
declare @tbl table (id int, start int, [end] int) 
insert @tbl values (1, 1, 5), (2, 6, 8), (3, 9 , 10); 


;with t(c) as 
(
    select * from (values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) a(b) 
), 
x(y) as 
(
    select t1.c * 100 + t2.c * 10 + t3.c 
    from t t1 
    cross join t t2 
    cross join t t3 
) 
select t.id, x.y 
from x 
join @tbl t on t.start <= x.y and t.[end] >= x.y 
order by t.id, x.y 
Verwandte Themen