web-dev-qa-db-fra.com

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

J'exécute cette requête sur MySQL

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

et c'est donner cette erreur:

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

Quelle est la cause de cette erreur?

346
silverkid

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 avoir 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, l'intégralité de la requête pourrait être remplacée par:

SELECT ID FROM TT2
487
Paul

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?

74
hometoast

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

Imaginez une table appelée purchases qui enregistre les achats effectués par customers à stores, c’est-à-dire qu’elle est 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);

..will rompre avec l'erreur Every derived table must have its own alias. Pour réparer:

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 le AS custom alias).

13
Neil Stockbridge