Qual è l'errore "Ogni tabella derivata deve avere il proprio alias" in MySQL?


386

Sto eseguendo questa query su MySQL

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

e sta dando questo errore:

Ogni tabella derivata deve avere il proprio alias.

Cosa sta causando questo errore?


14
Non potresti semplicemente semplificare questo come "seleziona ID da TT2"?
DMKing,

5
Recentemente ho ricevuto questo errore perché avevo un extra )in una query con molti messaggi UNION ALL.
aprono il

10
Visto che questa è la ricerca numero 1 su Google ... La risposta accettata non risponde realmente all'errore "Ogni tabella derivata deve avere un proprio alias". Guarda sotto per maggiori informazioni.
Daniel B. Chapman,

Risposte:


542

Ogni tabella derivata (sottoquery AKA) deve in effetti avere un alias. Vale a dire che ogni query tra parentesi deve avere un alias ( AS whatever), che può essere usato per fare riferimento ad essa nel resto della query esterna.

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

Nel tuo caso, ovviamente, l'intera query potrebbe essere sostituita con:

SELECT ID FROM TT2

21
Risposta corretta per il codice di esempio mostrato ma non la soluzione per la maggior parte degli utenti che cercano questa domanda.
Arriva il

1
@ToBe Sono curioso di cosa volevi dire? La risposta è vera in qualsiasi query, che se hai una tabella derivata nella tua clausola from devi dargli un alias.
AdamMc331,

2
Spiacenti, non ho visto che hai risolto anche la query originale e aggiunto le ASdichiarazioni. Pensavo che avessi mostrato solo la stenografia. rimosso il mio voto negativo.
Da

Sto pensando lo stesso con @ToBe. La risposta è questa: "Qui, la tabella derivata significa 'sottoquery utilizzata nella clausola FROM'. Nel caso degli interroganti, sono le sottoquery all'interno della parentesi. Se non si indica l'alias usando la parola chiave 'as' per quelle query, il motore di query dbms non è in grado di determinare quale query è cosa senza i loro nomi (o alias), quindi è necessario assegnare nomi univoci (alias) a tutte le query secondarie per fare in modo che il motore di query dbms funzioni correttamente. "
Bahadir Tasdemir,

1
Sarebbe meglio chiarire che la subquery non è necessariamente una tabella derivata: deve essere direttamente all'interno di una clausola FROM. Dichiarazioni come SELECT...FROM...WHERE x NOT IN (subquery) AS Tcauseranno un errore
Nicholas

76

Penso che ti stia chiedendo di fare questo:

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

Ma perché dovresti scrivere questa query in primo luogo?


16
la query effettiva è troppo lunga .. l'ho abbreviata abbastanza che la gente qui ha meno tempo per capirla. l'errore sulla query breve e lunga era lo stesso.
Silverkid,

Ora capisco. Stavo anche pensando che potrebbe essere stato generato da un codice. Dovrebbe comunque semplificare come suggerivano Paul e DMKing.
hometoast,

9
Wow, questa è davvero la seconda risposta non accettata? Per chiunque abbia il problema, questa è la risposta, MySQL richiede di etichettare la "sub query" invece di lasciarla come molte altre implementazioni.
Daniel B. Chapman,

17

Ecco un esempio diverso che non può essere riscritto senza alias (impossibile GROUP BY DISTINCT ).

Immagina una tabella chiamata purchasesche registra gli acquisti effettuati da customersat stores, ovvero è una tabella da molte a molte e il software deve sapere quali clienti hanno effettuato acquisti in più di un negozio:

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 l'errore Every derived table must have its own alias. Aggiustare:

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 l' AS customalias).


Qual è l'effetto di SUM (1) sulla sottoquery?
xssChauhan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.