Ändern einer Tabelle durch andere Datensätze

Jean M. Phridds

Neuer Benutzer
Beiträge
4
ich habe eine Tabelle mit einem Primary Key namens [ID]. Die weiteren Felder heißen u.a. [Kennung], [Gebiet] und [erledigt]. Es gibt mehrere Datensätze mit derselben [Kennung], z.B. [Kennung] = "ABC". Nur einer dieser Datensätze hat den Wert 1 im Feld [erledigt], alle anderen haben den Wert 0. Jede Kennung existiert also in nur einem Datensatz zugleich mit [erledigt] = 1, aber in mehreren Datensätzen zusätzlich mit [erledigt] = 0.
Bei allen Datensätzen mit [erledigt] = 1 ist auch das Feld [Gebiet] mit einem Text gefüllt, z.B. "Süddeutschland", die Datensätze mit [erledigt] = 0 haben keinen Inhalt.
Ich suche nun nach einer SQL-Update-Anweisung, mit der ich alle Datensätze der Datenbank ändern kann, die bei [erledigt] den Wert 0 haben. Dieser Wert 0 soll bei [erledigt] auch stehenbleiben, aber das Feld [Gebiet], das ja leer ist, soll einen Text erhalten, und zwar genau den selben Text, der im Datensatz im Feld [erledigt] den Wert 1 hat - bei derselben Kennung.

Beispiel:
vorher:
ID Kennung Gebiet erledigt
1 ABC Süddeutschland 1
2 ABC (leer) 0
3 ABC (leer) 0
4 DEF Norddeutschland 1
5 DEF (leer) 0
6 DEF (leer) 0


nachher:
ID Kennung Gebiet erledigt
1 ABC Süddeutschland 1
2 ABC Süddeutschland 0
3 ABC Süddeutschland 0
4 DEF Norddeutschland 1
5 DEF Norddeutschland 0
6 DEF Norddeutschland 0

Mit welchem Update-Befehl (wahrscheinlich mit einer Unterabfrage) mache ich aus der Tabelle vorher die Tabelle nachher?
 
Werbung:
Code:
test=# select * from jean_m ;
 id | kennung | gebiete | erledigt
----+---------+---------+----------
  1 | abc     | süd     | t
  2 | abc     |         | f
  3 | abc     |         | f
  4 | def     | nord    | t
  5 | def     |         | f
  6 | def     |         | f
(6 rows)

test=*# with foo as (select distinct kennung, gebiete from jean_m where erledigt) update jean_m set gebiete = foo.gebiete from foo where jean_m.kennung = foo.kennung and not erledigt;
UPDATE 4
test=*# select * from jean_m ;
 id | kennung | gebiete | erledigt
----+---------+---------+----------
  1 | abc     | süd     | t
  4 | def     | nord    | t
  2 | abc     | süd     | f
  3 | abc     | süd     | f
  5 | def     | nord    | f
  6 | def     | nord    | f
(6 rows)

test=*#

PostgreSQL, aber vielleicht 1:1 anwendbar.
 
Zurück
Oben