Sous-requêtes dans la clause FROM
<<<
Erreurs de sous-requêtes Optimisation des sous-requêtes
>>>

14.1.8 Sous-sélections ( SubSELECT )
14.1 Manipulation de données : SELECT , INSERT , UPDATE , DELETE
14 Syntaxe des commandes SQL
 Manuel de Référence MySQL 4.1 : Version Française

Les sous-requêtes comme opérateur scalaire
Comparaisons avec les sous-requêtes
Sous-requêtes avec les clauses ANY , IN et SOME
Sous-requêtes avec ALL
Sous-requêtes corrélées
EXISTS et NOT EXISTS
Sous-requêtes de ligne
Sous-requêtes dans la clause FROM
->Erreurs de sous-requêtes
Optimisation des sous-requêtes
Se passer des sous-requêtes avec les premières versions de MySQL

14.1.8.9 Erreurs de sous-requêtes

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

<< Erreurs de sous-requêtes >>
Sous-requêtes dans la clause FROM Sous-sélections ( SubSELECT ) Optimisation des sous-requêtes