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?
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?
Cada tabla derivada (también conocida como subconsulta) debe tener un alias. Es decir, cada consulta entre paréntesis debe recibir un alias (AS loquesea
), el cual puede ser utilizado 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 tu caso, por supuesto, toda la consulta podría ser reemplazada por:
SELECT ID FROM TT2
Aquí hay un ejemplo diferente que no se puede reescribir sin alias (no se puede GROUP BY DISTINCT
).
Imagina una tabla llamada compras
que registra las compras realizadas por clientes
en tiendas
, 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);
...fallará con el error Cada tabla derivada debe tener su propio alias
. Para solucionarlo:
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 el alias AS custom
).
Llegué aquí porque pensé que debería consultar en SO si hay respuestas adecuadas, después de un error de sintaxis que me dio este error, o si posiblemente podría publicar una respuesta yo misma.
OK, las respuestas aquí explican cuál es este error, así que no hay mucho más que decir, pero de todos modos daré mi opinión, usando mis propias palabras:
Este error se produce por el hecho de que básicamente generas una nueva tabla con tu subconsulta para el comando FROM
.
Eso es lo que se conoce como tabla derivada
, y como tal, necesita tener un alias
(en realidad una referencia de nombre a ella).
Dada la siguiente consulta hipotética:
SELECT id, key1
FROM (
SELECT t1.ID id, t2.key1 key1, t2.key2 key2, t2.key3 key3
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
WHERE t2.key3 = 'some-value'
) AS tt
Al final, toda la subconsulta dentro del comando FROM
producirá la tabla que se le da el alias como tt
y tendrá las siguientes columnas id
, key1
, key2
, key3
.
Luego, con el SELECT
inicial, finalmente seleccionamos el id
y key1
de esa tabla generada (tt
).
Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.