Qual é o erro "Toda tabela derivada deve ter seu próprio alias" no MySQL?


386

Estou executando esta consulta no MySQL

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

e está dando este erro:

Toda tabela derivada deve ter seu próprio alias.

O que está causando esse erro?


14
Você não poderia simplesmente simplificar isso como "selecionar ID do TT2"?
11119 DMKing

5
Eu recebi esse erro recentemente porque tinha um extra )em uma consulta com muitos UNION ALLs.
MPEN

10
Vendo como esta é a pesquisa nº 1 do Google ... A resposta aceita realmente não responde ao erro 'Toda tabela derivada deve ter seu próprio alias'. Veja abaixo mais informações.
Daniel B. Chapman

Respostas:


542

Toda tabela derivada (subconsulta AKA) deve realmente ter um alias. Ou seja, cada consulta entre parênteses deve receber um alias ( AS whatever), que pode ser usado para se referir a ela no restante da consulta externa.

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

No seu caso, é claro, toda a consulta pode ser substituída por:

SELECT ID FROM TT2

21
Resposta correta para o código de amostra mostrado, mas não a solução para a maioria dos usuários que procuram esta pergunta.
precisa saber é o seguinte

11
@ ToBe Estou curioso para saber o que você quis dizer com isso? A resposta é verdadeira em qualquer consulta: se você tiver uma tabela derivada na cláusula from, precisará fornecer um alias.
AdamMc331

2
Desculpe, eu não vi que você também corrigiu a consulta original e adicionou as ASinstruções. Eu pensei que você só mostrasse a taquigrafia. removi meu voto negativo.
ToBe 22/05

Estou pensando o mesmo com @ToBe. A resposta é a seguinte: "Aqui, tabela derivada significa 'subconsulta usada na cláusula FROM'. No caso dos questionadores; são as subconsultas entre parênteses. Se você não indicar o alias usando a palavra-chave 'como' para essas consultas, o mecanismo de consulta dbms não pode determinar qual é a consulta sem seus nomes (ou aliases); portanto, você deve fornecer nomes exclusivos (aliases) para todas as suas subconsultas para fazer com que o mecanismo de consulta dbms funcione corretamente. "
Bahadir Tasdemir

11
Seria melhor esclarecer que a subconsulta não é necessariamente uma tabela derivada: ela deve estar diretamente dentro de uma cláusula FROM. Afirmações como SELECT...FROM...WHERE x NOT IN (subquery) AS Tirão desencadear um erro #
16/03 Nicholas

76

Eu acho que está pedindo para você fazer isso:

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

Mas por que você escreveria essa consulta em primeiro lugar?


16
a consulta real é muito longa. Eu a reduzi o suficiente para que as pessoas aqui tenham menos tempo para entendê-la. o erro na consulta curta e longa foi o mesmo.
silverkid

Eu entendo agora. Eu também estava pensando que poderia ter sido gerado por algum código. Ainda deve simplificar, como sugeriram Paul e DMKing.
hometoast 11/12/2009

9
Uau, essa é realmente a segunda resposta inaceitável? Para quem está com o problema, essa é a resposta, o MySQL exige que você rotule a "subconsulta" em vez de deixá-la como muitas outras implementações.
Daniel B. Chapman

17

Aqui está um exemplo diferente que não pode ser reescrito sem apelidos (não pode GROUP BY DISTINCT).

Imagine uma tabela chamada purchasesque registra as compras feitas em customersat stores, ou seja, é uma tabela de muitos para muitos e o software precisa saber quais clientes fizeram compras em mais de uma loja:

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

..vai quebrar com o erro Every derived table must have its own alias. Consertar:

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

(Observe o AS customalias).


Qual é o efeito de SUM (1) na subconsulta?
xssChauhan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.