Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Speziellerer Updatebefehl

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von speedone, 7 Juli 2014.

  1. speedone

    speedone Benutzer

    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
     
  2. speedone

    speedone Benutzer

    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?
     
  3. speedone

    speedone Benutzer

    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)
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden