Spalte nach Bedingung aktualisieren

Hallo zusammen

Ich stehe gerade vor einem kleinen Problem, dass ich für eine Veranstaltung morgen lösen muss.

Ich habe zwei Tabellen (Tab1 und Tab2). In Tab1 werden in Spalte A Zahlen eingetragen. Wenn dort Zahlen eingetragen sind, sollen über eine Abfrage in Tab2 Werte auf 1 gesetzt werden.
In Tab2 sind genau die Werte aus Tab1, Spalte A Primary Key. Wenn also in Tab1, Spalte A die Zahl 100 steht, soll in der passenden Zeile von Tab2 in Spalte B eine 1 eingetragen werden.

Kann mir dazu jemand den SQL Befehl sagen? Ich bin wirklich nicht so fit in SQL.

Schon mal vielen Dank für Eure Hilfe!!!

Wenn ich Dich recht verstanden habe, willst Du bei einem Insert in tab_A gleichzeitig ein Update in tab_b. Für sowas wurden RULEs erfunden:

test=*# create table tab_a (a int);
CREATE TABLE
test=*# create table tab_b (a int, b int);
CREATE TABLE
test=*# commit;
COMMIT
test=# insert into tab_b(a) select * from generate_series(1,100) s;
INSERT 0 100
test=*# create rule rule_1 as on insert to tab_a do also update tab_b set b=1 where tab_b.a=new.a;
CREATE RULE
test=*# insert into tab_a (a) values (10);
INSERT 0 1
test=*# select * from tab_a;
 a
----
 10
(1 row)

test=*# select * from tab_b order by a limit 14;
 a  | b
----+---
  1 |
  2 |
  3 |
  4 |
  5 |
  6 |
  7 |
  8 |
  9 |
 10 | 1
 11 |
 12 |
 13 |
 14 |
(14 rows)

Okay so?

Andreas

Hallo und danke für die Schnelle Antwort.
Es ist ungefähr das was ich suche.
Ich beschreibe noch einmal genauer meine DB:

Tabelle Teilnehmer hat die Spalten id (PK) und (neben weiteren) presence. In Presence steht eine 1 für anwesend und eine 0 für abwesend.
Tabelle Platz hat die Spalten id (PK) und (neben weiteren ) Teilnehmer_id.

Über eine Weboberfläche wird nun in Platz.Teilnehmer_id z.B. die Zahl 120 eingetragen.
Wenn das passiert ist, soll automatisch in Teilnehmer.presence die Zahl 1 für anwesend eingetragen werden.

Das Ganze ist übrigens eine Postgre DB.

Ich habe das System fertig übernommen und muss nun Schönheitsreparaturen vornehmen…

Das ist dann aber redundant, besser wäre da doch ein VIEW, der Dir das anzeigt, oder?

test=# select * from tab_a;
 a
----
 10
(1 row)

test=*# create view anwesend as select s.*, case when tab_a.a is not null then 'anwesend' else 'fehlt' end as anwesenheit from generate_Series(1,20) s left join tab_a on tab_a.a=s.s;
CREATE VIEW
test=*# select * from anwesend ;
 s  | anwesenheit
----+-------------
  1 | fehlt
  2 | fehlt
  3 | fehlt
  4 | fehlt
  5 | fehlt
  6 | fehlt
  7 | fehlt
  8 | fehlt
  9 | fehlt
 10 | anwesend
 11 | fehlt
 12 | fehlt
 13 | fehlt
 14 | fehlt
 15 | fehlt
 16 | fehlt
 17 | fehlt
 18 | fehlt
 19 | fehlt
 20 | fehlt
(20 rows)

Andreas

Nein, ein View hilft mir nicht. Die Werte von Teilnehmer.presence sollen ja in der DB verändert werden.

Die Situation ist folgende: Teilnehmer werde per Scanner ihrem Platz zugeordnet. Das steht in der Tabelle Platz.Teilnehmer_id.
Leider werden die Werte in Teilnehmer.presence dann nicht automatisch auf 1 gesetzt.

Nun, Du kannst das auch via einem TRIGGER machen, in etwa so:

test=# create or replace function update_tab_b() returns trigger as $$begin update tab_b set b=1 where a=new.a; return new; end;$$ language plpgsql;
CREATE FUNCTION
test=*# create trigger trg_update after insert or update on tab_a for each row execute procedure update_tab_b();
CREATE TRIGGER

Ist natürlich nur rudimentär, die Funktion da oben. Aber als Einstieg, hoffe ich, reicht Dir das. Schau in die Doku, das ist alles reichlich beschrieben dort.


Andreas