Seite 1 von 1

Re: Fehler in Update Statement

Verfasst: Mi, 13.02.2013 16:04
von RobertG
Hallo Stephan,
Stephan03 hat geschrieben: Folgendes UPDATE-Statement habe ich mir ausgedacht, aus der Fehlermeldung werde ich allerdings nicht schlau:
Zuerst einmal vermisse ich hier die Fehlermeldung, die Du ansprichst. Denn genau die sollte ja erklärt werden.
Stephan03 hat geschrieben: UPDATE "Daten"
SET "Daten"."GEBOREN" = "gebdat"."gebdat"
WHERE ("Daten"."NAME" = "gebdat"."name" AND "Daten"."VORNAME" = "gebdat"."vorname")
Tip 1: "gebdat"."gebdat" ist nicht eindeutig. Die Spalte "gebdat" aus der Tabelle "gebdat" enthält natürlich jede Menge Datumsangaben, nicht nur eine.
Tip 2: Du fügst jetzt bei allen Datensätzen ein, die diese Bedingung erfüllen - und zwar nach dem gleichen Schema.
Tip 3: Du versuchst auf zwei Tabellen Bezug zu nehmen, ohne einen Select durchzuführen.
Der Standardbefehl lautet:

Code: Alles auswählen

UPDATE "Tabellenname" SET "Feldname" = <Expression> [, ...] [WHERE <Expression>];
<Expression> muss hier eindeutig sein.

Code: Alles auswählen

UPDATE "Daten" AS "a" SET "GEBOREN" = (SELECT "gebdat" FROM "gebdat" WHERE "a"."NAME" = "name" AND "a"."VORNAME" = "vorname") 
Das liefert Dir eindeutige Werte und schriebt nicht in einer Fehlermeldung "Single value expected" - vorausgesetzt, Du hast keine zwei Personen mit gleichem Vornamen und Nachnamen. Kann vorkommen. Hieß bei uns im Sportverein dann "Werner 1" und "Werner 2" ...

Gruß

Robert

Re: Fehler in Update Statement

Verfasst: Mi, 13.02.2013 16:10
von juetho
Hallo Stephan,
Stephan03 hat geschrieben:

Code: Alles auswählen

UPDATE "Daten"
SET "Daten"."GEBOREN" = "gebdat"."gebdat"
1. Ein UPDATE bezieht sich immer auf eine bestimmte Tabelle; deren Namen wird deshalb nicht bei der Spalte angegeben. (Es könnte sein, dass es akzeptiert wird; es ist aber zumindest unüblich.)
Stephan03 hat geschrieben:

Code: Alles auswählen

WHERE ("Daten"."NAME" = "gebdat"."name" AND "Daten"."VORNAME" = "gebdat"."vorname")
2. SQL arbeitet mengenorientert. Die WHERE-Bedingung bestimmt deshalb die Menge aller Datensätze, für die eine bestimmte Änderung (durch SET festgelegt) vorgenommen werden soll. Es bedeutet nicht, dass für jeden Datensatz dieser Menge eine einzelne bestimmte Änderung vorzunehmen ist.

3. Du suchst dagegen für alle Datensätze (also kein WHERE nötig) das Geburtsdatum (also einen bestimmten Wert), das für einen einzelnen Datensatz gültig ist. Das wird durch eine Unterabfrage erreicht, also etwa so:

Code: Alles auswählen

UPDATE "Daten"
   SET "GEBOREN" = (
       SELECT MAX("gebdat") FROM "gebdat"
        WHERE "Daten"."NAME" = "gebdat"."name" AND "Daten"."VORNAME" = "gebdat"."vorname"
       )
Das MAX habe ich eingefügt, damit immer genau ein Wert zur Verfügung gestellt wird.

Anmerkungen:
1. Wie du siehst, solltest du zwischen den Namen von Tabellen und Spalten (und Datenbanken) immer unterscheiden. Gleiche Namen führen zumindest zu Verwirrungen.
2. Ich hoffe doch, dass die Tabellen mit ID als Primärschlüssel arbeiten, was du hier nur der Übersicht halber verschweigst. Andernfalls gibt es über kurz oder lang Probleme.
3. Mehr Informationen findest du in der Einführung in SQL.

Gruß Jürgen

PS. Zum wiederholten Mal ist Robert zwei Minuten schneller als ich, und er hat im Wesentlichen die gleichen Gesichtspunkte gebracht. Ich speichere meinen Beitrag trotzdem: doppelte Erklärungen mit unterschiedlichen Formulierungen können hilfreich sein.

Re: Fehler in Update Statement

Verfasst: Do, 14.02.2013 07:10
von DPunch
Servus
juetho hat geschrieben:Das MAX habe ich eingefügt, damit immer genau ein Wert zur Verfügung gestellt wird.
Hierzu sei noch angemerkt, dass ein MAX dort nichts zu suchen hat und die Vorgehensweise auf keinen Fall nachahmenswert ist.
EIn von der Logik her falsches Statement abzusetzen, nur um eine Fehlermeldung zu verhindern, ist immer der falsche Weg.

Re: Fehler in Update Statement

Verfasst: Do, 14.02.2013 08:56
von RobertG
Hallo DPunch,

eigentlich müsste bei allen Personen mit gleichem Vor- und Nachnamen das Geburtsdatum nicht übertragen werden, die anderen Geburtsdaten aber schon. Also wäre eine Abfrage notwendig, die zuerst über Count die entsprechenden Duplikate ermittelt, die dann rausfliegen. Für die genaue Konstruktion fehlt mir jetzt die Zeit.

Gruß

Robert

Re: Fehler in Update Statement

Verfasst: Do, 14.02.2013 09:52
von juetho
DPunch hat geschrieben:Hierzu sei noch angemerkt, dass ein MAX dort nichts zu suchen hat und die Vorgehensweise auf keinen Fall nachahmenswert ist.
Eigentlich ist jede Abfrage nach Vorname/Nachname, die genau einen Wert haben möchte, abwegig. Für einen "sauberen Umweg" muss man sich aber mit der Datenstruktur selbst beschäftigen; und darauf zielten weder die Fragestellung noch Problem und Lösungsvorschläge. Da wir nicht wissen, wie die betroffenen Tabellen zusammenhängen, können wir auch nichts zum Primärschlüssel sagen (zumal er in einer der Tabellen fehlte).

Ich sollte mir wohl angewöhnen, auf die Problematik hinzuweisen, wenn ich einen solchen unsauberen Weg benutze. Jürgen