2009-12-11 18 views
269

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

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

y que está dando este error:

Every derived table must have its own alias.

¿Qué está causando este error?

+13

¿No podría simplemente simplificar esto como "seleccionar ID de TT2"? – DMKing

+2

Recibí este error recientemente porque tenía un ')' extra en una consulta con muchos 'UNION ALL's. – mpen

+9

Viendo cómo esta es la búsqueda número 1 en Google ... La respuesta aceptada realmente no responde al error 'Cada tabla derivada debe tener su propio alias'. Mira debajo para más información. –

Respuesta

380

Cada tabla derivada (AKA subconsulta) 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, toda la consulta podría sustituirse por:

SELECT ID FROM TT2 
+16

Respuesta correcta para el código sampe que se muestra, pero no la solución para la mayoría de los usuarios que buscan esta pregunta. – ToBe

+1

@ToBe Tengo curiosidad por saber qué quieres decir con eso? La respuesta es cierta en cualquier consulta, que si tiene una tabla derivada en su cláusula from, necesita darle un alias. – AdamMc331

+2

Lo siento, no vi que también corrigió la consulta original y agregó las declaraciones 'AS'. Pensé que solo mostrabas la taquigrafía. eliminé mi voto negativo. – ToBe

64

Creo que es pidiendo que hagas esto:

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

Pero ¿por qué habría que escribir esta consulta en el primer lugar?

+8

la consulta real es demasiado larga. La he acortado lo suficiente como para que la gente aquí tenga menos tiempo para entenderla. el error en la consulta corta y larga fue el mismo. – silverkid

+0

Entiendo ahora. También estaba pensando que podría haber sido generado por algún código. Todavía debería simplificarse como sugirieron Paul y DMKing. – hometoast

+8

Guau, ¿esta es realmente la segunda respuesta no aceptada? Para cualquiera que tenga el problema, esta es la respuesta, MySQL requiere que etiquetes la "sub consulta" en lugar de simplemente dejarla como muchas otras implementaciones. –

11

Aquí está un ejemplo diferente que no puede ser reescrito sin alias (no puede GROUP BY DISTINCT).

Imagínese una tabla llamada purchases que registra las compras realizadas por customers en stores, es decir, se trata de un muchos a muchos mesa y el software tiene que 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); 

. .se romperá con el error Every derived table must have its own alias. Para solucionar:

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

(Nota AS custom los alias).

+0

¿Cuál es el efecto de SUM (1) en la subconsulta? –

Cuestiones relacionadas