2016-07-05 8 views
0

Angenommen, ich habe eine Tabelle wieSQL: wie beliebige Zeiten auf Selbst Vereinigung

Name Value 
Cat 10 
Dog 15 

nun einen Eingabeparameter „N“ gegeben, selbst Vereinigung die Tabelle „N“ mal durch eine neue Spalte erstellen, den Wert 0 zu N - 1 für jede Ursprungszeile. Zum Beispiel, wenn N 2 ist, sollte die resultierende Tabelle

Name Value Count 
Cat 10  0 
Cat 10  1 
Dog 15  0 
Dog 15  1 

werden, wenn „N“ 4 ist, sollte die resultierende Tabelle

Name Value Count 
Cat 10  0 
Cat 10  1 
Cat 10  2 
Cat 10  3 
Dog 15  0 
Dog 15  1 
Dog 15  2 
Dog 15  3 

sein, wie eine SQL-Anweisung für SQL Server schreiben, das eine nimmt Eingabeparameter "N", um die Tabelle wie oben gezeigt zu erstellen?

Dank

+1

Bitte kennzeichnen Sie die verwendeten dbsms –

+1

Sie könnten damit beginnen zu sagen, was RDBMS und Version Sie verwenden. MySQL ?, SQL Server ?, Oracle ?, POstgresql? .... – Lamak

Antwort

1

Eine Möglichkeit ist die Erzeugung der Zahlen unter Verwendung eines rekursiven CTE und Durchführen einer Cross-Join zu tun.

declare @n int = 5; 
with nums(n) as (select 0 
       union all 
       select n+1 from nums where n < @n-1) 
select t.*,num.n 
from tablname t 
cross join nums num 
3

Union ist das falsche Wort hier, CROSS JOIN ist, was benötigt wird.

Auf den meisten Plattformen können Sie dies mit einem rekursiven CTE und Cross Join tun.

WITH numberList as 
(
    SELECT <input number here> AS NUM 
    UNION ALL 
    SELECT NUM-1 
    FROM numberList 
    WHERE NUM-1 >= 0 
) 
SELECT t.name, t.value, numberList.num 
FROM tablename, numberList 

Wenn Sie erwarten, dass num groß ist (zB über 10k), sollten Sie es nicht so machen. Stattdessen sollten Sie (auf den meisten Plattformen) eine temporäre Tabelle mit einem generierten Index/einer generierten Sequenz erstellen.