Vinzenz Mai: DELETE mit einem subquery

Beitrag lesen

Hallo

Lassen wir die DELETE-Klausel einmal aussen vor. Jetzt habe ich es mit dem Beispiel aus der Dokumentation versucht, das eigentlich gehen sollte.

UPDATE t ... WHERE col = (SELECT (SELECT ... FROM t...) AS _t

mein MySQL-Befehl:

UPDATE t1 SET col='aaa' WHERE id = ( SELECT ( SELECT id FROM t1 ) AS _t WHERE _t.id ='11064' );

erstens ist die Anweisung fehlerhaft, zweitens ist sie unsinnig.

Schauen wir uns das im Detail an:

1. Fehler

  
UPDATE t1                  -- Du möchtest Inhalte von Tabelle t1 modifizieren  
SET col='aaa'  
WHERE id = (  
    SELECT (  
        SELECT id FROM t1  -- Dann solltest Du im Subselect einen Tabellenalias verwenden  
    ) AS _t  
    WHERE _t.id ='11064'  
)  

#1093 - You can't specify target table 't1' for update in FROM clause

Logisch. Die Fehlermeldung käme auch, wenn nicht schon vorher ein Fehler wäre.

2. Fehler:

  
UPDATE t1                  -- Du möchtest Inhalte von Tabelle t1 modifizieren  
SET col='aaa'              -- und zwar die Werte in den Zeilen, deren id  
WHERE id = (               -- bestimmten Werten entspricht  
    SELECT (               -- Dein Subselect ergibt zwar nur einen Wert  
        SELECT id FROM t1  -- dennoch ist das ein Syntax-Verstoß, weil  
    ) AS _t                -- das auf Zufall beruht  
    WHERE _t.id ='11064'   -- Verwende IN statt =  
)  

3. Unsinn

Warum ein doppelt geschachteltes Subselect, wenn es ein einfache IN täte?

  
UPDATE t1  
SET col='aaa'  
WHERE id IN (<Liste der entsprechenden id-Werte>) -- hier einer  

Wenn Du in Wirklichkeit etwas anderes machen möchtest, dann hast Du Dein Beispiel auf unzulässige Weise vereinfacht. Gib in diesem Fall an, wie Deine Tabelle wirklich aussieht und wie Deine Kriterien wirklich aussehen.

Ich verstehe jedenfalls nicht, was Du vorhast.

Freundliche Grüße

Vinzenz