Update mit Subselect
hawkmaster
- datenbank
0 Juve0 ChrisB0 hawkmaster0 dedlfix
Hallo zusammen,
Folgendes sql bringt mir 10 Zeilen zurück:
SELECT A.ViewFlag FROM produkte A WHERE A.ViewFlag > 6 AND A.ViewFlag < 15
Jetzt würde ich gerne in diesen Zeilen einen Update der Spalte ProduktgruppenID = 3 machen.
Versucht habe ich es so:
UPDATE produkte SET ProduktgruppenID = 3 WHERE ViewFlag IN (SELECT A.ViewFlag FROM produkte A WHERE A.ViewFlag > 6 AND A.ViewFlag < 15)
MySQL Meldet mir aber:
#1093 - You can't specify target table 'produkte' for update in FROM clause
Was mache ich falsch?
vielen Dank und viele Grüße
hawk
Glück auf!
UPDATE produkte SET ProduktgruppenID = 3 WHERE ViewFlag IN (SELECT A.ViewFlag FROM produkte A WHERE A.ViewFlag > 6 AND A.ViewFlag < 15)
Reicht nicht ein einfaches ` update produkte set ProduktgruppenID=3 where ViewFlag > 6 and ViewFlag < 15 `{:.language-sql}?
Abgesehen davon:
Subselects scheinen in MySQL nicht zu funktionieren, dafür aber Joins, siehe auch http://dev.mysql.com/doc/refman/5.1/de/update.html fast ganz unten: "UPDATE-Anweisungen für mehrere Tabellen können jedoch einen beliebigen Join-Typ verwenden, der für SELECT-Anweisungen zulässig ist, also etwa LEFT JOIN." Das Beispiel auf genannter Seite ist eigentlich recht brauchbar.
Gruß,
der Juve
Glück auf!
Hmpf, zu lange nichts mehr hier geschrieben...
http://dev.mysql.com/doc/refman/5.1/de/update.html
Jetzt auch als Link: MySQL-Doku
Gruß,
der Juve
Hi,
MySQL Meldet mir aber:
#1093 - You can't specify target table 'produkte' for update in FROM clauseWas mache ich falsch?
Hm - du weigerst dich, eine klar formulierte Tatsache zu verstehen?
MfG ChrisB
Hallo ChrisB,
Hm - du weigerst dich, eine klar formulierte Tatsache zu verstehen?
na ja, was heisst weigern. Ich dachte zuerst da es ja auch ein INSERT .. SELECT gibt. müsste es ja auch bei einem Update gehen.
Ich hatte die Fehlermeldung nicht ganz verstanden bzw. im deutschen MySQL Manual stand es nicht ganz so eindeutig:
"Zurzeit können Sie in einer Unterabfrage keine Aktualisierungsoperation in einer Tabelle durchführen und gleichzeitig eine Auswahl in einer anderen Tabelle treffen. "
wie im englischen drin:
"Currently, you cannot update a table and select from the same table in a subquery. "
vielen Dank und viele Grüße
hawk
Hi!
Ich dachte zuerst da es ja auch ein INSERT .. SELECT gibt. müsste es ja auch bei einem Update gehen.
Im Handbuch zu INSERT...SELECT steht auch, was MySQL anstellt, damit das geht. Dies macht es bei Subquerys (noch) nicht (selbständig).
Ich hatte die Fehlermeldung nicht ganz verstanden bzw. im deutschen MySQL Manual stand es nicht ganz so eindeutig:
"Zurzeit können Sie in einer Unterabfrage keine Aktualisierungsoperation in einer Tabelle durchführen und gleichzeitig eine Auswahl in einer anderen Tabelle treffen. "
Ja, das ist irgendwie nicht verständlich. Wieder ein Grund, Dokumentationsübersetzungen möglichst zu meiden. (Das Verstehen von englischen Texten mag zwar dem einen oder anderen schwerfallen, doch wenn man es nicht übt, kann es auch nicht leichter werden.)
wie im englischen drin:
"Currently, you cannot update a table and select from the same table in a subquery. "
Das currently bezieht sich darauf, dass es vielleicht in einer zukünftigen Version möglich sein könnte. Das Problem daran ist, dass eben zunächst speicherintensiv eine temporäre Tabelle erstellt werden muss. Ansonsten gibt es unter Umständen ein Dilemma, wenn das Update Daten ändert und damit das Selektionsergebnis der Subquery ändert. Wie auch immer, derzeit führt kein Weg daran vorbei, die Abfrage umzugestalten. Den Trick mit der temporären Tabelle kann man ja auch zu Fuß gehen.
Lo!