¿Cuál es el error "Cada tabla derivada debe tener su propio alias" en MySQL?

386

Estoy ejecutando esta consulta en MySQL

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

y está dando este error:

Cada tabla derivada debe tener su propio alias.

¿Qué está causando este error?

silverkid
fuente
14
¿No podría simplemente simplificar esto como "seleccionar ID de TT2"?
DMKing
55
Recibí este error recientemente porque tenía un extra )en una consulta con muchos UNION ALLs.
mpen
10
Viendo como esta es la búsqueda # 1 de Google ... La respuesta aceptada realmente no responde al error 'Cada tabla derivada debe tener su propio alias'. Mira abajo para más información.
Daniel B. Chapman

Respuestas:

542

Cada tabla derivada (subconsulta de AKA) debe tener un alias. Es decir, cada consulta entre paréntesis debe tener un alias ( AS whatever), que puede usarse para referirse a ella en el resto de la consulta externa.

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

En su caso, por supuesto, la consulta completa podría reemplazarse con:

SELECT ID FROM TT2
Pablo
fuente
21
Respuesta correcta para el código de muestra que se muestra, pero no es la solución para la mayoría de los usuarios que buscan esta pregunta.
ToBe
1
@ ToBe Tengo curiosidad por lo que quisiste decir con eso. La respuesta es cierta en cualquier consulta, que si tiene una tabla derivada en su cláusula from, debe darle un alias.
AdamMc331
2
Lo siento, no vi que también arregló la consulta original y agregó las ASdeclaraciones. Pensé que solo mostrabas la taquigrafía. Eliminé mi voto negativo.
ToBe
Estoy pensando lo mismo con @ToBe. La respuesta es esta: "Aquí, tabla derivada significa 'subconsulta utilizada en la cláusula FROM'. En el caso de los interrogadores; son las subconsultas dentro del paréntesis. Si no indica el alias usando la palabra clave 'as' para esas consultas, el motor de consultas dbms no puede determinar qué consulta es qué sin sus nombres (o alias), por lo que debe dar nombres únicos (alias) para todas sus subconsultas para que el motor de consultas dbms haga que funcione correctamente ".
Bahadir Tasdemir
1
Sería mejor aclarar que la subconsulta no es necesariamente una tabla derivada: tiene que estar directamente dentro de una cláusula FROM. Las declaraciones como SELECT...FROM...WHERE x NOT IN (subquery) AS Tprovocarán un error
Nicholas
76

Creo que te está pidiendo que hagas esto:

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

Pero, ¿por qué escribirías esta consulta en primer lugar?

tostada casera
fuente
16
la consulta real es demasiado larga ... la acorté lo suficiente como para que la gente de aquí tenga menos tiempo para comprenderla. El error en la consulta corta y larga fue el mismo.
silverkid
Entiendo ahora. También estaba pensando que podría haber sido generado por algún código. Todavía debería simplificarse como Paul y DMKing sugirieron.
hometoast
99
Wow, ¿esta es realmente la segunda respuesta no aceptada? Para cualquiera que tenga el problema, esta es la respuesta, MySQL requiere que etiquete la "subconsulta" en lugar de dejarla como muchas otras implementaciones.
Daniel B. Chapman
17

Aquí hay un ejemplo diferente que no se puede reescribir sin alias (no se puede GROUP BY DISTINCT).

Imagine una tabla llamada purchasesque registra las compras realizadas por customersat stores, es decir, es una tabla de muchos a muchos y el software necesita saber qué clientes han realizado compras en más de una tienda:

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

.. romperá con el error Every derived table must have its own alias. Arreglar:

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);

(Tenga en cuenta el AS customalias).

Neil Stockbridge
fuente
¿Cuál es el efecto de SUM (1) en la subconsulta?
xssChauhan