448 Stimmen

Sie können die Zieltabelle für die Aktualisierung nicht in der FROM-Klausel angeben

Ich habe eine einfache mysql-Tabelle:

CREATE TABLE IF NOT EXISTS `pers` (
  `persID` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(35) NOT NULL,
  `gehalt` int(11) NOT NULL,
  `chefID` int(11) DEFAULT NULL,
  PRIMARY KEY (`persID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

INSERT INTO `pers` (`persID`, `name`, `gehalt`, `chefID`) VALUES
(1, 'blb', 1000, 3),
(2, 'as', 1000, 3),
(3, 'chef', 1040, NULL);

Ich habe versucht, das folgende Update auszuführen, aber ich erhalte nur die Fehlermeldung 1093:

UPDATE pers P 
SET P.gehalt = P.gehalt * 1.05 
WHERE (P.chefID IS NOT NULL 
OR gehalt < 
(SELECT (
    SELECT MAX(gehalt * 1.05) 
    FROM pers MA 
    WHERE MA.chefID = MA.chefID) 
    AS _pers
))

Ich suchte nach dem Fehler und fand von mysql folgende Seite http://dev.mysql.com/doc/refman/5.1/en/subquery-restrictions.html aber das hilft mir nicht weiter.

Was soll ich tun, um die SQL-Abfrage zu korrigieren?

18voto

Ajak6 Punkte 677

Der von BlueRaja gepostete Ansatz ist langsam, ich habe ihn modifiziert als Ich habe es benutzt, um Duplikate aus der Tabelle zu löschen. Falls es jemandem mit großen Tabellen hilft Ursprüngliche Abfrage

DELETE FROM table WHERE id NOT IN (SELECT MIN(id) FROM table GROUP BY field 2)

Dies erfordert mehr Zeit:

DELETE FROM table WHERE ID NOT IN(
  SELECT MIN(t.Id) FROM (SELECT Id, field2 FROM table) AS t GROUP BY field2)

Schnellere Lösung

DELETE FROM table WHERE ID NOT IN(
   SELECT t.Id FROM (SELECT MIN(Id) AS Id FROM table GROUP BY field2) AS t)

15voto

Hari Das Punkte 8998

MySQL erlaubt es nicht, aus einer Tabelle auszuwählen und gleichzeitig in derselben Tabelle zu aktualisieren. Aber es gibt immer einen Workaround :)

Das funktioniert nicht >>>>

UPDATE table1 SET col1 = (SELECT MAX(col1) from table1) WHERE col1 IS NULL;

Aber das funktioniert >>>>

UPDATE table1 SET col1 = (SELECT MAX(col1) FROM (SELECT * FROM table1) AS table1_new) WHERE col1 IS NULL;

11voto

Lukasz Szozda Punkte 137580

MariaDB hat dies ab 10.3.x aufgehoben (sowohl für DELETE y UPDATE ):

UPDATE - Anweisungen mit derselben Quelle und demselben Ziel

Ab MariaDB 10.3.2 können UPDATE-Anweisungen die gleiche Quelle und das gleiche Ziel haben.

Bis MariaDB 10.3.1 funktionierte die folgende UPDATE-Anweisung nicht:

UPDATE t1 SET c1=c1+1 WHERE c2=(SELECT MAX(c2) FROM t1);
  ERROR 1093 (HY000): Table 't1' is specified twice, 
  both as a target for 'UPDATE' and as a separate source for data

Ab MariaDB 10.3.2 wird die Anweisung erfolgreich ausgeführt:

UPDATE t1 SET c1=c1+1 WHERE c2=(SELECT MAX(c2) FROM t1);

DELETE - Gleiche Quell- und Zieltabelle

Bis MariaDB 10.3.1 war das Löschen aus einer Tabelle mit derselben Quelle und demselben Ziel nicht möglich. Ab MariaDB 10.3.1 ist dies nun möglich. Zum Beispiel:

DELETE FROM t1 WHERE c1 IN (SELECT b.c1 FROM t1 b WHERE b.c2=0);

DBFiddle MariaDB 10.2 - Fehler

DBFiddle MariaDB 10.3 - Erfolg

10voto

Filippo Mazza Punkte 4142

Als Referenz können Sie auch Mysql-Variablen verwenden, um temporäre Ergebnisse zu speichern, z. B.:

SET @v1 := (SELECT ... );
UPDATE ... SET ... WHERE x=@v1;

https://dev.mysql.com/doc/refman/5.7/en/user-variables.html

3voto

Krish Punkte 5852

Wenn Sie versuchen, FeldA aus TabelleA zu lesen und es auf FeldB in derselben Tabelle zu speichern, wenn Feldc = Feldd ist, sollten Sie dies berücksichtigen.

UPDATE tableA,
    tableA AS tableA_1 
SET 
    tableA.fieldB= tableA_1.filedA
WHERE
    (((tableA.conditionFild) = 'condition')
        AND ((tableA.fieldc) = tableA_1.fieldd));

Der obige Code kopiert den Wert von FeldA nach FeldB, wenn das Bedingungsfeld Ihre Bedingung erfüllt. Dies funktioniert auch in ADO (z.B. Access)

Quelle: selbst ausprobiert

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X