hawkmaster1: Update mit Subselect eigene Tabelle

Hallo zusammen,

es sollte ein Update einer MySQL Tabelle gemacht werden, der einen Subselect auf die eigene Tabelle enthält. Soe wie unten erscheint die Meldung

You can't specify target table 'table1' for update in FROM clause

Ich weiss das man hier mittels einer Temp Tabelle das irgendwie eliminieren kann, aber ich weiss nicht wie man dies umschreiben soll?

UPDATE tabtime AS table1
SET table1.timeid = (
    SELECT timeid FROM work WHERE userid IN  
    (
        Select table2.userid from tabtime AS table2
   )
)

vielen Dank Gruss hawk

akzeptierte Antworten

  1. Moin,

    ich denke hier kommst du mit gleichlautenden Spaltenbezeichnungen durcheinander. Da sollte man IMMER das alias zu ALLEN Tabellenspalten in das Query einfügen. Darf ich mal aufdröseln?

    UPDATE tabtime AS table1
    SET table1.timeid = (
        SELECT work.timeid FROM work WHERE work.userid IN  
        (
            Select table2.userid from tabtime AS table2
       )
    )
    

    Korrekt?

    Gruß Bobby

    --
    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    1. Hallo sorry für die späte Antwort. Ich war unterwegs. vielen Dank für die Hilfe.

      Leider klappt es auch auf diese Schreibweise nicht. Die Fehlermeldung bleibt die selbe.

      Man muss es wohl doch mit einem zusätzlichen Subselect machen und mit "AS temptable". So wie hier in dem Beispiel erwähnt. http://www.twiedmann.de/sqlbackstube/mysql_komplexe_updates

      Ich weiss nur nicht wie ich das in meinem Fall so hinbekomme, weil ich ja eh schon zwei Subselects habe.

      Gruss hawk

  2. Tach!

    You can't specify target table 'table1' for update in FROM clause

    Das Handbuch schreibt dazu den Satz: Currently, you cannot update a table and select from the same table in a subquery.

    Ich weiss das man hier mittels einer Temp Tabelle das irgendwie eliminieren kann, aber ich weiss nicht wie man dies umschreiben soll?

    Ja, aber das was du notiert hast, ist keine temporäre Tabelle sondern eine Subquery. Eine temporäre legt man mit CREATE TEMPORARY TABLE ... an. Das muss keine vollständige Definition sein. Nach dem Namen kann man ein Select-Statement notieren, anhand dessen Ergebnismenge die Tabelle erstellt und gefüllt wird. Das Anlegen musst du übrigens außerhalb und vor dem UPDATE machen, und in ihm kannst du dann aus der Temp-Tabelle selektieren.

    dedlfix.

    1. Hallo und guten Abend,

      You can't specify target table 'table1' for update in FROM clause

      Das Handbuch schreibt dazu den Satz: Currently, you cannot update a table and select from the same table in a subquery.

      Und wie ist das, wenn man die Tabelle in einem zweiten Arbeitsbereich nochmal öffnet und die abgefragte Spalte selber nicht updated?

      Ich habe das mit brutaler Igonranz schon öfter so gemacht und bisher sind keine Fehler aufgetreten.

      Ist das jetzt Grauzone, oder einfach nur Dusel?

      Grüße
      TS

      1. Tach!

        Das Handbuch schreibt dazu den Satz: Currently, you cannot update a table and select from the same table in a subquery.

        Und wie ist das, wenn man die Tabelle in einem zweiten Arbeitsbereich nochmal öffnet und die abgefragte Spalte selber nicht updated?

        Es gibt kein öffnen und geöffnet halten. Es gibt Abfragen, die eine Ergebnismenge liefern oder die Änderungen am Tabelleninhalt vornehmen. Die tun ihr Ding und sind dann fertig. Auch ist "Arbeitsbereich" nichts, was der SQL-Server kennt.

        Ich habe das mit brutaler Igonranz schon öfter so gemacht und bisher sind keine Fehler aufgetreten. Ist das jetzt Grauzone, oder einfach nur Dusel?

        Das ist eher etwas, das die eigentlich Arbeitsweise eines SQL-Servers dir gegenüber erfolgreich verschleiert hat ;)

        dedlfix.

    2. Hallo dedlfix, danke für deine Hilfe. (konnte nicht früher antworten) Ich glaube man braucht nicht wirklich eine echte Temporäre Tabelle mit Create ... Wenn ich es richtig deute kann man das mit einem zusätzlichen Subselect und "AS tabel.." so erreichen das MySQL nicht mehr bockt und der doppelte Tabellennamen eliminiert wird. (Listing 3 im Beispiel Link) Linkbeschreibung

      oder auch hier: /Linkbeschreibung

      Ich weiss nur nicht wie ich das in meinem Fall umschreiben muss, da ich ja eh schon zwei Subselects brauche?

      Gruss hawk

      1. Tach!

        Wenn ich es richtig deute kann man das mit einem zusätzlichen Subselect und "AS tabel.." so erreichen das MySQL nicht mehr bockt und der doppelte Tabellennamen eliminiert wird.

        Doppelte Tabellennamen sind nicht das Problem, die kann man mit Alias wegbekommen. Das Problem bleibt aber bestehen, dass du eine temporäre Tabelle brauchst.

        Linkbeschreibung

        Auf jener Seite wird nicht genau beschrieben, warum die Lösung funktioniert. Aber da ist auch ein Verweis zu einer Seite mit MySQL-FAQs angegeben. Wenn du dort mal liest, bekommst du die Lösung erklärt. Sie arbeitet weiterhin mit einer temporären Tabelle, aber die legt MySQL selbständig an, wenn - und das ist der springende Punkt - die Subquery in einer FROM-Klausel notiert ist.

        dedlfix.

  3. Hallo zusammen, ich habe jetzt eine Lösung gefunden indem ich den Update mit einem Inner Join umgeschrieben habe.

    Für diejenigen die es interessiert:

    UPDATE tabtime tb1 JOIN work tb2 ON tb2.userid = tb1.userid SET tb1.timeid = tb2.timeid;

    So kommt keine MySQL Fehlermeldung mehr.

    viele Grüße hawk