Quelle est l'erreur «Chaque table dérivée doit avoir son propre alias» dans MySQL?

386

J'exécute cette requête sur MySQL

SELECT ID FROM (
    SELECT ID, msisdn
    FROM (
        SELECT * FROM TT2
    )
);

et il donne cette erreur:

Chaque table dérivée doit avoir son propre alias.

Quelle est la cause de cette erreur?

silverkid
la source
14
Ne pourriez-vous pas simplement simplifier cela comme "sélectionner l'ID de TT2"?
DMKing
5
J'ai eu cette erreur récemment parce que j'avais un extra )dans une requête avec beaucoup de UNION ALLs.
mpen
10
Vu que c'est la recherche Google n ° 1 ... La réponse acceptée ne répond pas vraiment à l'erreur "Chaque table dérivée doit avoir son propre alias". Regardez ci-dessous pour plus d'informations.
Daniel B. Chapman

Réponses:

542

Chaque table dérivée (sous-requête AKA) doit en effet avoir un alias. C'est-à-dire que chaque requête entre crochets doit recevoir un alias ( AS whatever), qui peut être utilisé pour s'y référer dans le reste de la requête externe.

SELECT ID FROM (
    SELECT ID, msisdn FROM (
        SELECT * FROM TT2
    ) AS T
) AS T

Dans votre cas, bien sûr, la requête entière pourrait être remplacée par:

SELECT ID FROM TT2
Paul
la source
21
Bonne réponse pour le code sampe affiché mais pas la solution pour la plupart des utilisateurs qui recherchent cette question.
ToBe
1
@ToBe Je suis curieux de savoir ce que vous vouliez dire par là? La réponse est vraie dans toute requête, que si vous avez une table dérivée dans votre clause from, vous devez lui donner un alias.
AdamMc331
2
Désolé, je n'ai pas vu que vous avez également corrigé la requête d'origine et ajouté les ASinstructions. Je pensais que tu ne montrais que la sténographie. supprimé mon downvote.
ToBe
Je pense la même chose avec @ToBe. La réponse est la suivante: "Ici, le tableau dérivé signifie" sous-requête utilisée dans la clause FROM ". Dans le cas des intervenants; ce sont les sous-requêtes à l'intérieur de la parenthèse. Si vous n'indiquez pas l'alias en utilisant le mot clé" as " pour ces requêtes, le moteur de requête dbms ne peut pas déterminer quelle requête est sans leurs noms (ou alias). Vous devez donc donner des noms uniques (alias) à toutes vos sous-requêtes pour que le moteur de requête dbms fasse fonctionner correctement. "
Bahadir Tasdemir
1
Il serait préférable de préciser que la sous-requête n'est pas nécessairement une table dérivée: elle doit être directement dans une clause FROM. Des déclarations comme SELECT...FROM...WHERE x NOT IN (subquery) AS Tdéclencheront une erreur
Nicholas
76

Je pense que cela vous demande de faire ceci:

SELECT ID
FROM (SELECT ID,
             msisdn 
      FROM (SELECT * FROM TT2) as myalias
     ) as anotheralias;

Mais pourquoi voudriez-vous écrire cette requête en premier lieu?

hometoast
la source
16
la requête réelle est trop longue .. je l'ai suffisamment raccourcie pour que les gens d'ici aient moins de temps pour la comprendre. l'erreur sur la requête courte et longue était la même.
silverkid
Je comprends maintenant. Je pensais également que cela aurait pu être généré par du code. Cela devrait encore se simplifier comme l'ont suggéré Paul et DMKing.
hometoast
9
Wow, est-ce vraiment la deuxième réponse non acceptée? Pour toute personne ayant le problème, c'est la réponse, MySQL vous oblige à étiqueter la "sous-requête" au lieu de la laisser comme beaucoup d'autres implémentations.
Daniel B. Chapman
17

Voici un exemple différent qui ne peut pas être réécrit sans alias (impossible GROUP BY DISTINCT).

Imaginez une table appelée purchasesqui enregistre les achats effectués par customersà stores, c'est- à -dire qu'il s'agit d'une table plusieurs à plusieurs et que le logiciel doit savoir quels clients ont effectué des achats dans plusieurs magasins:

SELECT DISTINCT customer_id, SUM(1)
  FROM ( SELECT DISTINCT customer_id, store_id FROM purchases)
  GROUP BY customer_id HAVING 1 < SUM(1);

... rompra avec l'erreur Every derived table must have its own alias. Pour corriger:

SELECT DISTINCT customer_id, SUM(1)
  FROM ( SELECT DISTINCT customer_id, store_id FROM purchases) AS custom
  GROUP BY customer_id HAVING 1 < SUM(1);

(Notez l' AS customalias).

Neil Stockbridge
la source
Quel est l'effet de SUM (1) sur la sous-requête?
xssChauhan