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)
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.
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