brauche dringend Hilfe...SQL-Anfänger

Hallo Leute, ich brauche drigend eure Hilfe. Bin neu in SQL unterwegs, seid daher bitte nicht böse, wenn dies eine blöde Frage ist… :astonished:

Folgendes Problem.

Ich muss eine Tabelle “updaten”, also bestimme Daten ändern.
Die Tabelle heisst “Kontakte”, geändert werden soll das Feld “anlass” in 208 (numerisch), wenn das Feld kontakte.aktivitaet 1,2,4,6,11,21,31 beinhaltet. wenn nicht, sollen die Werte in kontakte.anlass so bleiben wie sie sind. Gleichzeitig soll, wenn kontakte.anlass geändert wird, der ursprüngliche Wert in Kontakte.Notizen angehangen werden (dort können u.U. schon Werte enthalten sein. Allerdings soll nicht der Zahlenwert aus Kontakte.anlass, sondern der “gedolmetschte” Wert aus anlaesse.name angehängt werden. Die Tabelle anlaesse bestet aus anlaesse.nr (identisch mit kontakte.anlass) und anlaesse.name (quasi die Bezeichnung im Klartext).

Kann ih dies in einem Statement durchführen, oder müssen zwei erfolgen (Erst anhängen im kontakte.notiz und dann Umstellung von kotakte.anlaesse)? Und wie müssen die Statements aussehen?

Könnt Ihr mir helfen???

Danke und Gruß
maaaaac

Je nach Version geht das mit einem einzelnen SQL-Befehl. Also, wenn Du 9.1 hast, dann geht das mit einem einzigen Befehl (Stichwort: writeable CTE). Ansonsten brauchst Du mehrere, die Du dann in eine Transaktion bündeln solltest. Um das SQL jetzt zu basteln hab ich aber grad keine Zeit…

Ach ja: wenn immer die ‘alte’ Version archiviert werden soll, bietet sich auch ein TRIGGER an, der das übernimmt. Dann erzwingst du das durch die Datenbank selbst, und überläßt es nicht dem ‘guten Willen’ desjenigen, der das Update durchführt.

Also, Du hast nun einige Hinweise, ich hoffe, Du kommst weiter …


Andreas

Parse error meinerseits: da ist ja ‘nur’ eine Tabelle im Update involviert.

test=# select * from anlaesse ;
 nr | name
----+-------
  1 | eins
  2 | zwei
  3 | drei
  4 | vier
  5 | fuenf
  6 | sechs
(6 rows)

test=# select * from kontakte ;
 anlass | aktivitaet | notizen
--------+------------+---------
      2 |          1 |
      2 |          2 |
      2 |          3 |
      2 |          4 |
      2 |          5 |
(5 rows)

test=# begin;
BEGIN
test=# update kontakte set anlass = 208, notizen = coalesce(notizen,'') || ',' || anlaesse.name from anlaesse where aktivitaet in (1,2,4) and anlaesse.nr=kontakte.anlass;
UPDATE 3
test=# select * from kontakte ;
 anlass | aktivitaet | notizen
--------+------------+---------
      2 |          3 |
      2 |          5 |
    208 |          4 | ,zwei
    208 |          2 | ,zwei
    208 |          1 | ,zwei
(5 rows)

sollte das sein, was Du suchst. So in etwa zumindest, oder? Geht auch mit älteren Versionen.


Andreas

Hm, funktioniert leider nicht. Bekomme folgende Fehlermeldung:

08:38:20: Fehlertext: [IBM][CLI Driver][DB2/NT] SQL0104N Auf “: ’ || anlaesse.name” folgte das unerwartete Token “from”. Zu den möglichen Token gehören: “.”. SQLSTATE=42601

Kannst Du da was mit anfangen?

Danke und Gruß

maaaaac

Nein, ich kenne DB2 nicht. Ach ja: Du bist damit hier falsch.


Andreas