2009-06-30 12 views
2

dies nicht möglich sein kann, aber ich dachte, dass ich es hier draußen werfen würde:Zurück mehr Zeilen aus einer einzigen Reihe

die folgende Tabelle angegeben:

ID, Beginn, Ende
123, 1 , N

wobei N eine ganze Zahl ist, eine Abfrage, die folgende Ergebnismenge zurückzukehren:

ID, Begin, End
123, 1, 1
123, 1, 2
123, 1, 3
.
.
.
123, 1, N

Die Plattform, die wir verwenden, ist SQL Server 2005, aber wenn Sie es mit einem anderen Geschmack von SQL zu tun, würde ich immer noch in der Lösung interessiert.

+0

vergessen Sie nicht, eine Antwort zu wählen –

+0

Ich werde nicht vergessen. Ich muss die Lösungen testen und werde basierend auf der Leistung die beste auswählen. Ich werde es bis nächste Woche nicht schaffen. –

Antwort

1

try this:

create table #smalltable (id int, [begin] int, [end] int) 
insert into #smalltable values (123,1,4) 
insert into #smalltable values (124,1,12) 
insert into #smalltable values (125,1,7) 

;WITH digits (d) AS (
    SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION 
    SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION 
    SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION 
    SELECT 0) 
SELECT 
    s.id, s.[begin], n.Number AS [End] 
    FROM (SELECT i.d + ii.d * 10 + iii.d * 100 + iv.d * 1000 + 
       v.d * 10000 + vi.d * 100000 AS Number 
       FROM digits   i 
        CROSS JOIN digits ii 
        CROSS JOIN digits iii 
        CROSS JOIN digits iv 
        CROSS JOIN digits v 
        CROSS JOIN digits vi 
     ) AS N 
     INNER JOIN #smalltable         s ON 1=1 
     INNER JOIN (SELECT MAX([end]) AS MaxEnd FROM #smalltable) dt ON 1=1 
    WHERE n.Number > 0 AND n.Number<=dt.MaxEnd 
    AND n.Number<=s.[end] 
    ORDER BY s.id,n.Number 

Kommentare

  • nicht nennen Ihre Spalten die reservierten Worte: "Beginne" und "Ende", wirst du mir eines Tages danken.
  • wenn Sie planen, dies oft in der Produktion, laufen create a Numbers table
    und benutzen Sie diese Abfrage statt:

müssen eine Tabelle Zahlen haben, bevor dies funktionieren wird (siehe Link oben)

SELECT 
    s.id,s.[begin],n.Number AS [End] 
    FROM Numbers    n 
     INNER JOIN #smalltable s ON 1=1 
    WHERE n.Number > 0 AND n.Number<=s.[end] 
    ORDER BY s.id,number 

wird es besser laufen.

+1

Danke, alle, für die Lösungen. Dies ist ein großartiger Ort! –

1

einige Given (theoretisch unendlich, aber man konnte im Vorhinein ausfüllen) Tabelle ganzer Zahlen, die alle die ganzen Zahlen enthält, ist die Antwort recht einfach:

SELECT ID, Begin, I FROM YourTable, Integers 
WHERE I <= Begin AND I >= End 

mit einem Clustered-Index auf Integers.I, sollte dies sehr schnell. Sie könnten Ganzzahlen in einem Stored-Proc vorbelegen (basierend auf dem Ergebnis von SELECT max(End) FROM YourTable).

1

Dies funktioniert bis 99.999, und Sie können es problemlos ändern, um weitere Zahlen hinzuzufügen. Es benötigt keine bereits vorhandene Nummerntabelle und keine gespeicherte Prozedur und ist immer noch unglaublich schnell. Funktioniert auf mindestens SQL Server 2000 und höher, und ist zu anderen Aromen von SQL leicht portiert:

select MyTable.ID, MyTable.[Begin], n.N 
from (
    select 123 as ID, 1 as [Begin], 9 as [End] 
) MyTable 
cross join (
    select a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) + (10000 * e.a) as N 
    from (select 0 as a union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) as a 
    cross join (select 0 as a union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) as b 
    cross join (select 0 as a union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) as c 
    cross join (select 0 as a union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) as d 
    cross join (select 0 as a union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) as e 
) n 
where n.N > 0 
    and n.N <= MyTable.[End] 
order by n.N 
Verwandte Themen