Agregierte Liste ausdröseln

Hallo!

Ich bräuchte einen kleinen Schubser in die richtige Richtung und jemanden der fit in SQL ist, der mir unter die Arme greift.

Ich hab eine SQL Tabelle in folgendem Format:

ID Menge
1 3
2 2

Kann mir jemand sagen, wie ich in einem SELECT daraus jeweils einzelne Zeilen mache? Also anstelle einmal ID 1 mit Menge 3 dreimal ID 1 mit Menge 1?

Ziel wäre dann dies:

ID Menge
1 1
1 1
1 1
2 1
2 1

Am liebsten wäre mit eine Lösung, die nur mit einem SELECT auskommt und funktionieren bräuchte es nur mit MS SQL, aber eine generell anwendbare Lösung wäre auch nicht schlecht.

Tabellenzeilen vervielfachen
Moin, RedWraith,

dieses Ansinnen verstößt gegen alle Regeln der Kunst (genauer: der relationalen Datenbank), deshalb stellt SQL keine Lösung dafür bereit.

Jeder Satz in einer Relation ist eindeutig zu identifizieren, darum können sich in einer Relation niemals doppelte Sätze befinden.

SQL ist keine prozedurale Sprache, deshalb gibt es in ihr keine Schleifenanweisung. Die bräuchtest Du aber, um sowas zu formulieren wie „Erzeuge so viele Sätze wie im Feld Menge vorgegeben“. Möglicherweise ermöglichen irgendwelche Datenbanken derartige Schleifen, das wäre dann aber keineswegs SQL, sondern eine herstellereigene („proprietäre“) Erweiterung.

In jeder beliebigen Programmiersprache lassen sich Schleifen einrichten, auch solche, die Tabellen entgegen den relationalen Regeln befüllen. Du müsstest Dir halt Gedanken um das Feld Id machen - es identifiziert dann nichts mehr.

Gruß Ralf

Huuuuh,

Sowas hatte ich schon befürchtet.

Danke trotzdem.

Hi RedW,

ich hätte zumindest eine Lösung für Oracle anzubieten:

-- tabelle erzeugen
create table yyy (id number not null, amount number not null);

-- Daten rein 
insert into yyy (id, amount) values (1,3);
insert into yyy (id, amount) values (2,1);
insert into yyy (id, amount) values (3,2);
commit;

select \* from yyy order by id;

/\*
-- Ergebnis
ID AMOUNT
-- ------
 1 3 
 2 1 
 3 2 
\*/

-- jetzt der Trick (mit ausglagertem Subselect)
with a as
(
 select 
 rownum rn
 from 
 dual 
 connect by rownum 

Jetzt muss sich nur noch jemand finden, der sich mit MSSQL auskennt (und das Ganze falls möglich portiert).

HTH
bernhard