hawkmaster: Update mit Subselect

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

  1. 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
    
    1. 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

  2. Hi,

    MySQL Meldet mir aber:
    #1093 - You can't specify target table 'produkte' for update in FROM clause

    Was mache ich falsch?

    Hm - du weigerst dich, eine klar formulierte Tatsache zu verstehen?

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. 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

      1. 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!