Seite 1 von 1

SQL-Update - Fehler Single value expected

Verfasst: So, 13.01.2013 22:04
von NTClient
Hallo Jungs (und Mädels),

mal ne schnelle Frage zwischendurch. Ich komm einfach nicht weiter. Es gibt ne Tabelle Mitglieder, inder jemand die Abteilung als Text reingeschrieben hat. Dann gibt es eine Tabelle Abteilungen, in der die Abteilungen durchnummeriert sind. Jetzt will ich die Spalte "AbtNr" in der Tabelle "Mitglieder" über die Textverbindung zur Tabelle "Abteilungen" mit der "Abteilungsnummer" auffüllen. Ähm ... habt Ihr das verstanden?

Tabelle Mitglieder
Name, Abteilung, Abteilungnummer
Hans Müller, Fussball, -- (leer)
Fritz Schmidt, Handball, -- (leer)
dabei ist Abteilungsnummer vom Typ Integer.

Tabelle Abteilungen
ID, Name
1 Fussball
2 Handball
dabei ist ID vom Typ Integer.

Der SQL-Befehl lautet:

Code: Alles auswählen

update "Mitglieder" set "Abteilungsnummer" = select "ID" from "Abteilungen" where "Abteilungen"."Name" = "Mitglieder"."Abteilung"
In der Statusmeldung erscheint jedoch der Fehler:
Single value expected.

Komisch ist:

Code: Alles auswählen

select "ID" from "Abteilungen" where "Abteilungen"."Name" = "Mitglieder"."Abteilung"
funktioniert.

Code: Alles auswählen

update "Mitglieder" set "Abteilungsnummer" = 123
funktioniert auch.

Erwartet er einen Feldtyp "Single", oder was soll das bedeuten?

Re: SQL-Update - Fehler Single value expected

Verfasst: So, 13.01.2013 23:48
von DPunch
Servus

Die Fehlermeldung bedeutet, dass das SELECT-Statement in Deiner Set-Klausel in mindestens einem Fall mehr als eine Zeile zurückgibt.
Welches Ergebnis bringt folgende Abfrage?

Code: Alles auswählen

SELECT 
	"m"."Name",
	COUNT("a"."ID") 
FROM
	"Mitglieder" "m" JOIN ""Abteilungsnummer" "a" 
		ON "m"."Name" = "a"."Abteilung"
GROUP BY 
	"m"."Name" 
HAVING
	COUNT("a"."ID") > 1

Re: SQL-Update - Fehler Single value expected

Verfasst: Mo, 14.01.2013 08:50
von juetho
DPunch hat geschrieben:Die Fehlermeldung bedeutet, dass das SELECT-Statement in Deiner Set-Klausel in mindestens einem Fall mehr als eine Zeile zurückgibt.
Das muss gar nicht der Fall sein. Es genügt schon, dass die Datenbank nicht automatisch erkennen kann, dass der SELECT im SET tatsächlich nur einen Wert liefert; die Art des Befehls könnte (jedenfalls theoretisch) auch mehrere Werte ergeben. Ergänze den Befehl einfach:

Code: Alles auswählen

update "Mitglieder" 
   set "Abteilungsnummer" 
       = (select MAX("ID") 
            from "Abteilungen" 
           where "Abteilungen"."Name" = "Mitglieder"."Abteilung")
Die Klammer empfehle ich in diesem Fall dringend, um deutlich zu machen, wohin das WHERE gehört.

Falls es dir nicht sowieso schon klar ist, erwähne ich vorsorglich: Zuerst sollten die Abteilungnummern eingetragen werden; dann kann der Fremdschlüssel zugewiesen werden. Schließlich sollte die Abteilungnummer als "Eingabe erforderlich" festgelegt und die alte Spalte "Abteilung" entfernt werden.

Gruß Jürgen

Gelöst

Verfasst: Mo, 14.01.2013 17:30
von NTClient
Jupp das war's. Ich hatte übersehen, dass ein Abteilungsname zwei mal auftaucht. Simpel der Fehler, eigentlich sogar blöd. Aber ich hatte ihn nicht gefunden, weil ich an den Feldtyp "single" dachte.

Egal ... vielen Dank jedenfalls!

Bernd!

Re: SQL-Update - Fehler Single value expected

Verfasst: Mo, 14.01.2013 21:05
von DPunch
Servus
juetho hat geschrieben:Das muss gar nicht der Fall sein. Es genügt schon, dass die Datenbank nicht automatisch erkennen kann, dass der SELECT im SET tatsächlich nur einen Wert liefert; die Art des Befehls könnte (jedenfalls theoretisch) auch mehrere Werte ergeben.
Nein, die Datenbank kümmert sich nicht darum, wie viele Zeilen der SELECT theoretisch zurückgeben könnte. Ansonsten müsste das Statement schon beim Parsen ausgeführt werden.
Wenn ein MAX, MIN oder irgendeine andere Aggregratfunktion oder meinetwegen auch ein DISTINCT das vorliegende Problem behebt, dann nur aus dem Grund, dass dadurch in diesem Fall tatsächlich nur noch ein Wert zurückgegeben wird, obwohl mehrere existieren - eine solche Vorgehensweise ist jedoch ein absolutes No-Go, da hierdurch fehlerhafte Datenstrukturen verschleiert werden.