Speziellerer Updatebefehl

speedone

Benutzer
Beiträge
12
Hallo Leute,

ich hoffe ihr könnt mir helfen.
Ich benötige eine Lösung in Form eines "einfachen" Update-Befehls (am Besten ohne Prozeduren und Sonstiges) und komme nicht sorecht weiter.

Ich habe eine Tabelle "Belege". Spalten: Kennung (GUID), KennungCopy(GUID), etc....
Die KennungCopy kann als Eintrag einen "Verweis" auf die Hauptkennung ("Kennung") haben. (Bei Kopien)

Ich möchte jetzt alle Zeilen Updaten und dabei prüfen, ob die angegebene Kennung in KennungCopy als Hauptkennung ("Kennung") noch existiert.

Beispiel:
Datensatz1:da960b4b-d36d-4a1a-b7a4-63014026ca07 | null
Datensatz2:78efb356-d4d8-4044-9f0f-41d219e86bdb | da960b4b-d36d-4a1a-b7a4-63014026ca07
Datensatz3:f6ce50ca-cc2c-40bf-a399-2d091078b0eb | e2b33dce-9607-427e-9556-ca8bf5c0f2a1

Bei Datensatz3 existiert die "e2b33dce-9607-427e-9556-ca8bf5c0f2a1" nicht mehr als "Hauptkennung", die KennungCopy soll auf "NULL" gesetzt werden:

Datensatz3:f6ce50ca-cc2c-40bf-a399-2d091078b0eb | null
 
Werbung:
Mein Ansatz ist aktuell:

UPDATE Belege
SET KennungCopy = NULL
WHERE NOT EXISTS (SELECT b.Kennung FROM Belege AS b WHERE b.Kennung = KennungCopy)

Dieser Befehl setzt allerdings alle KennungCopy auf NULL. Habe ich da etwas nicht bedacht?
 
Ich habe die Lösung nun gefunden. Mit der folgenden kleinen Ergänzung klappts:
UPDATE Belege
SET KennungCopy = NULL
FROM Belege AS a
WHERE NOT EXISTS (SELECT b.Kennung FROM Belege AS b WHERE b.Kennung = a.KennungCopy)
 
Werbung:
Ich habe die Lösung nun gefunden.

Nein. Die Lösung wäre, solche Inkonsitenzen gleich zu vermeiden:

Code:
test=# create table speedone (id int primary key, id_parent int references speedone on delete set null, val text);
CREATE TABLE

test=*# insert into speedone values (1, null, 'eins');
INSERT 0 1
test=*# insert into speedone values (2, 1, 'zwei');
INSERT 0 1
test=*# insert into speedone values (3, null, 'drei');
INSERT 0 1
test=*# delete from speedone where id = 1;
DELETE 1
test=*# select * from speedone ;
 id | id_parent | val
----+-----------+------
  3 |  | drei
  2 |  | zwei
(2 rows)

Beim Delete vom Datensatz 1, auf den ja vom Datensatz 2 verwiesen wird, wird der Verweis gleich mit auf NULL gesetzt. ON DELETE SET NULL.
 
Zurück
Oben