insert je row-result

Ludwigmller

SQL-Guru
Beiträge
168
Moin,
ich möchte für jedes Ergebnis eines SELECT-Statements einen INSERT in eine andere Tabelle ausführen.
Bsp:
Code:
postgres=# select id from test where value is not null;
 id
----
  1
  4
  5
  6
  7
  8
 10
 11
 12
(9 Zeilen)
Je id soll ein Eintrag in tab erzeugt werden.
Code:
INSERT INTO tab (fk_id, gruppe) VALUES (1, 'G1');
INSERT INTO tab (fk_id, gruppe) VALUES (4, 'G1');

Wie mache ich das am besten? Zu berücksichtigen ist auch, dass dieses bei neuen Einträgen in test aktualisiert werden soll, 'G1' bleibt nämlich konstant. Also entweder löscht man vorher alle Einträge mit 'G1', oder es wird tatsächlich aktualisiert. Es muss aber nicht automatisch bei einem INSERT erfolgen, es reicht, wenn es vor einen Zugriff auf tab erfolgt (frontend).
 
Werbung:
ich bin mir nicht sicher, ob ich dich richtig verstehe, aber vielleicht hilft ja ein VIEW:

Code:
postgres=# create table test(id int);
CREATE TABLE
postgres=# copy test from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> 1
>> 4
>> 5
>> 6
>> 7
>> \.
COPY 5
ostgres=# create view tab as select id, 'G1' from test;
CREATE VIEW
postgres=# select * from tab;
 id | ?column? 
----+----------
  1 | G1
  4 | G1
  5 | G1
  6 | G1
  7 | G1
(5 rows)

postgres=#
 
Ich brauche es in einer bestehenden Tabelle, daher geht es als View nicht.
So klappt es wie gewünscht:
Code:
postgres=# delete from tab_g where gruppe like 'G1';
DELETE 9
postgres=# insert into tab_g (select id,'G1' from test where value is not null);
INSERT 0 9

Verbesserungsvorschläge?
 
Zuletzt bearbeitet:
Vielleicht hast Du Dich nur unglücklich ausgedrückt, aber LIKE '61' ist identisch zu = '61' - da wird kein Wildcard implizit hinzugefügt. Also kann LIKE 61 nicht "schnell mal" 611 zurück liefern
Jaein. Ich weiß das wohl aber jemand der mit LIKE arbeitet weiß auch das da gefühlt was fehlt. So ein % ist schnell ergänzt ohne nach zu denken. Abgesehen davon würde ich MySQL sofort unterstellen das nach eigenem Ermessen zu verwechseln (Und Code wird ja auch mal kopiert).

LIKE ist einfach der falsche Operator. Auch wenn das Ergebnis stimmt ist das nicht nur schlechter Stil sondern in meinen Augen falsch.
 
Werbung:
Speichere einen Integer nicht als Zeichenkette.
2) Nutze LIKE richtig, mit % als Platzhalter, oder gar nicht und dann das Gleichheitszeichen. LIKE 61 kann auch schnell mal 611 sein.
In der "richtigen" Tabelle ist dem Wert noch ein Präfix vorangestellt, daher muss es varchar und LIKE sein...
Was wir nicht wissen: warum Du das machen willst. Möglicherweise ist das alles nicht sonderlich geschickt, aber dazu wissen wir zu wenig ...
Es handelt sich um eine Zuordnung von Mitgliedern zu einer Gruppe, da hätte ich schon mal einen Beitrag zu geschrieben, welche Alternativen es gibt. Bis jetzt habe ich noch keine Änderungen vorgenommen
 
Zurück
Oben