Datensätze mehrfach ausgeben

Hallo
ich habe eine Tabelle:
Anzahl, Was
2, Brot
4, Fleisch

und möchte sie nun folgendermaßen ausgegeben haben:
Brot
Brot
Fleisch
Fleisch
Fleisch
Fleisch

Ich habe schon gegoogelt und eine vielversprechende Lösung gefunden: Leider für SQL Server 2005!
WITH MyCTE(Anzahl, Essen)
AS
(
SELECT Anzahl, Essen FROM EssenTest
UNION ALL
SELECT Anzahl = Anzahl - 1, Essen
FROM MyCTE WHERE Anzahl > 1
)
SELECT Anzahl, Essen
FROM MyCTE
ORDER BY Essen

Vielleicht kann mir das einer nach PostgreSQL übersetzen?
Ich bekomme das nicht hin.
Gruß
Gunnar



test=*# select * from ggroetschel ;
 anzahl |   was
--------+---------
      2 | brot
      4 | fleisch
(2 rows)

test=*# with recursive r(anzahl, was) as (select anzahl, was from ggroetschel union all select anzahl-1, was from r where anzahl > 1) select was from r order by was;
   was
---------
 brot
 brot
 fleisch
 fleisch
 fleisch
 fleisch
(6 rows)

Mit Postgres 9.3 gibt es noch eine andere Lösung:

select e.was
from essen e
  cross join lateral (select generate_series(1, e.anzahl) i) t

Rekursive CTEs kann Postgres natürlich auch (wie Andreas ja auch schon gezeigt hat). SQL Server hält sich leider nicht an die Anforderungen des SQL Standards und deswegen darf man dort kein RECURSIVE angeben. Postgres hat das aber entsprechend dem SQL Standard implementiert, und deswegen wird das Keyword RECURSIVE benötigt.

Mehr Details zu rekursiven CTEs gibt’s im Handbuch: http://www.postgresql.org/docs/current/static/queries-with.html

Ja wie geil ist das denn bitte?

Vielen dank, ich glaub, ich komme diesen komischen lateral joins nun etwas näher. Danke!

Das ist eigentlich ganz einfach.

Immer wenn Du den Fehler:

ERROR: invalid reference to FROM-clause entry for table "xyz"
   There is an entry for table "xyz", but it cannot be referenced from this part of the query.

bekommst, ist vermutlich die Lösung ein LATERAL join :wink:

Großartig. Danke an euch beide!
Gruß
Gunnar