2009-12-11 1 views
269

Je suis en cours d'exécution cette requête sur MySQLQuelle est l'erreur "Chaque table dérivée doit avoir son propre alias" dans MySQL?

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

et il donne cette erreur:

Every derived table must have its own alias.

Qu'est-ce qui provoque cette erreur?

+13

Ne pourriez-vous pas simplement simplifier cela comme "sélectionner l'ID de TT2"? – DMKing

+2

J'ai récemment eu cette erreur parce que j'avais un ')' supplémentaire dans une requête avec beaucoup de 'UNION ALL's. – mpen

+9

Voyant comme ceci est la recherche n ° 1 de Google ... 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. –

Répondre

380

Chaque table dérivée (sous-requête AKA) doit en effet avoir un alias. C'est à dire. chaque requête entre parenthèses 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, toute requête pourrait être remplacée par:

SELECT ID FROM TT2 
+16

Correcte réponse pour le code sampe indiqué mais pas la solution pour la plupart des utilisateurs qui cherchent 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, 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 instructions 'AS'. Je pensais que vous avez seulement montré la sténographie. enlevé mon downvote. – ToBe

64

Je pense qu'il vous demande de le faire:

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

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

+8

la requête réelle est trop longue .. je l'ai raccourcie assez que les gens ici ont moins de temps à le comprendre. l'erreur sur la requête courte et longue était la même. – silverkid

+0

Je comprends maintenant. Je pensais aussi qu'il pourrait avoir été généré par un code. Il devrait encore simplifier comme Paul et DMKing suggéré. – hometoast

+8

Wow, est-ce vraiment la deuxième réponse non acceptée? Pour tous ceux qui ont ce problème, MySQL vous demande d'étiqueter la "sous-requête" au lieu de la laisser comme beaucoup d'autres implémentations. –

11

Voici un autre exemple qui ne peut pas être réécrite sans alias (ne peut pas GROUP BY DISTINCT).

Imaginez une table appelée purchases qui enregistre les achats effectués par customers à stores, à savoir qu'il est un de plusieurs à plusieurs table et le logiciel a besoin de savoir que les clients ont effectué des achats à plus d'un magasin:

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

. .pas rompre 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 les AS custom alias).

+0

Quel est l'effet de SUM (1) sur la sous-requête? –

Questions connexes