Nummerierung der Abfrageergebnisse

Hallo PG’ler

Ich bekomm bei einer Abfrage eine Liste zurück. Kann ich jetzt hingehen und da eine Spalte dazu machen und die Hochzählen lassen?? Gibts so was??

Beispiel:

NR|Name|Vorname
1 |ABCD|jkjkejekj
2 |EFGH|dkjflekwlökl

Das Feld NR müsste sozusagen dazugemacht werden.

Prinzip verstanden??


Waldi

Ja. Die Lösung nennet sich ‘sequence’.

test=*# select * from w;
    t
---------
 foo
 Foo
  Foo
  Foo
  Fooii
(5 rows)

Time: 55.003 ms
test=*# create sequence w_seq;
CREATE SEQUENCE
Time: 49.074 ms
test=*# select nextval('w_seq'), t from w;
 nextval |    t
---------+---------
       1 | foo
       2 | Foo
       3 |  Foo
       4 |  Foo
       5 |  Fooii
(5 rows)

Achtung: danach steht die Sequence auf 5. Ein nochmaliger aufruf ergibt daher:

test=*# select nextval('w_seq'), t from w;
 nextval |    t
---------+---------
       6 | foo
       7 | Foo
       8 |  Foo
       9 |  Foo
      10 |  Fooii
(5 rows)

Besser also, die Sequence innerhalb einer TX temporär erstellen.
Andere Lösung: eine SRF, die Dir die Tabelle + der Counter-Spalte liefert.


Andreas

OK gefällt mir irgendwie. Aber wie erstell ich das nur temporär?? Würde meine SQL Abfrage dann so aussehen
create sequence
abfrage
drop sequenz

Zum Thema SRF. Muss erst noch mal drüber lesen. Was findest du als Master das beste?? Ich denk halt mal das erste ist am einfachsten oder??

PostgreSQL: Documentation: Manuals: PostgreSQL 8.2: Set Returning Functions

Hmm das hab ich gefunden. Habe jetzt mal folgendes Probiert und bin auf Granit gestossen.

SELECT * FROM generate_series(1, count(lager.laid)), lager

Sonst ist des ja voll geil. Des find ich richtig geil die SRF’s



test=# create temporary sequence w_seq;
CREATE SEQUENCE

Andreas

Hä? Was willst Du erreichen?

select * from generate_series(1,(select count(laid) from lager));

Oder?

[/quote]
Sonst ist des ja voll geil. Des find ich richtig geil die SRF’s[/QUOTE]

Tja, wenn Du es sagst? Ich meinte zwar eher, das man sich das selber schreiben kann, aber egal.

Andreas

Schwachsinn:
also die SRF gibt eine Folge von Zahlen aus (Start,Stop). Start ist ja klar aber Stop?? Ich weis ja nicht im vorraus wieviel Zeilen die Abfrage hat.


Sorry hab dein letzter Beitrag ned richtig gelesen.
Dankeschön. Das erste ist wunderbar hier

select * from generate_series(1,(select count(laid) from lager)); weis ich nicht wie ich noch daten dazumachen lassen kann.
Das geht nicht
select , from generate_series(1,(select count(laid) from lager)),lager; Das widerholt sich so

Na sowas aber auch…

test=# select * from w;
    t
---------
 foo
 Foo
  Foo
  Foo
  Fooii
(5 rows)

Time: 0.960 ms
test=*# create function count_w(OUT count_out int, OUT w_out text) returns setof record as $$declare i int; rec record; begin i:=0;for rec in select * from w loop count_out:=i;w_out:=rec.t;return next;i:=i+1;end loop;end;$$ language plpgsql;
CREATE FUNCTION
Time: 4.158 ms
test=*# select * from count_w();
 count_out |  w_out
-----------+---------
         0 | foo
         1 | Foo
         2 |  Foo
         3 |  Foo
         4 |  Fooii
(5 rows)

Andreas, genug für heute…

Sorry für das durcheinander hier. Hier noch einmal um Klarheit zu bekommen: Wie schon oben geändert, es ist alles wunderbar nur das geht nicht:

select * from generate_series(1,(select count(laid) from lager));

Ich hab das Probiert aber das widerholt sich (Weis nicht wie ich es anderst ausdrücken soll).

select *,* from generate_series(1,(select count(laid) from lager)),lager;

Ich brauch ja nicht nur die Nummerierung ich brauch ja auch die Datensätze dazu

[quote=“waldi”]
Ich hab das Probiert aber das widerholt sich (Weis nicht wie ich es anderst ausdrücken soll).

Sag einfach: CROSS JOIN. Das ist es nämlich.
Relationale Datenbanken - Kapitel 7

Gestern abend zeigte ich ja eine kleine selbstgeschriebene Funktion, die das, was Du willst, macht. Ansonsten verwende eine Sequence, das zeigte ich ja auch schon. Oder ORA, das hat da wohl etwas. Oder zähle in der Applikation.

Andreas