Il y a de nouvelles erreurs qui ne s'appliquent qu'aux sous-requêtes. Cette section les rassemble, car elles vous aideront à garder en tête certains points importants.
ERROR 1235 (ER_NOT_SUPPORTED_YET) SQLSTATE = 42000 Message = "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'"
Cela signifie que
SELECT * FROM t1 WHERE s1 IN (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1)
ne fonctionnera pas, mais uniquement dans certaines versions d'origines, comme MySQL 4.1.1.
ERROR 1240 (ER_CARDINALITY_COL) SQLSTATE = 21000 Message = "Operand should contain 1 column(s)"
Cette erreur va survient dans des cas comme celui-ci :
SELECT (SELECT column1, column2 FROM t2) FROM t1;
Il est valide d'utiliser une sous-requête qui utilise plusieurs colonnes, dans le cadre d'une comparaison. See Section 13.1.8.5, « Sous-requêtes de ligne ». Mais dans d'autres contextes, la sous-requête doit être un opérande scalaire.
ERROR 1241 (ER_SUBSELECT_NO_1_ROW) SQLSTATE = 21000 Message = "Subquery returns more than 1 row"
Cette erreur survient dans des cas comme celui-ci :
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
mais uniquement lorsque plus d'une ligne sont extraites de
t2
. Cela signifie que cette erreur peut
survenir dans du code qui fonctionne depuis longtemps :
quelqu'un vient de modifier le nombre de ligne que la
requête retourne. N'oubliez pas que si votre but est de
trouver un nombre arbitraire de lignes, et non pas juste
une seule, la commande correcte aurait été :
SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2);
Error 1093 (ER_UPDATE_TABLE_USED) SQLSTATE = HY000 Message = "You can't specify target table 'x' for update in FROM clause"
Cette erreur survient dans des cas comme celui-ci :
UPDATE t1 SET column2 = (SELECT MAX(column1) FROM t1);
Il est valide d'utiliser une sous-requête lors d'une
affectation dans une commande UPDATE
, car
les sous-requêtes sont valides avec les commandes
UPDATE
et DELETE
, tout
comme dans les commandes SELECT
. Cependant,
vous ne pouvez pas les utiliser sur la même table, qui est
ici t1
, car cette table est alors la cible
de la clause FROM
et de la commande
UPDATE
.
Généralement, l'échec d'un sous-requête entraîne l'échec de toute la commande.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.