Was ist der Fehler "Jede abgeleitete Tabelle muss einen eigenen Alias ​​haben" in MySQL?

386

Ich führe diese Abfrage unter MySQL aus

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

und es gibt diesen Fehler:

Jede abgeleitete Tabelle muss einen eigenen Alias ​​haben.

Was verursacht diesen Fehler?

Silberkind
quelle
14
Könnten Sie dies nicht einfach als "ID aus TT2 auswählen" vereinfachen?
DMKing
5
Ich habe diesen Fehler kürzlich erhalten, weil ich )in einer Abfrage mit vielen UNION ALLs ein Extra hatte .
Mpen
10
Angesichts der Tatsache, dass dies die Nummer 1 der Google-Suche ist ... Die akzeptierte Antwort beantwortet den Fehler "Jede abgeleitete Tabelle muss einen eigenen Alias ​​haben" nicht wirklich. Schauen Sie unten für weitere Informationen.
Daniel B. Chapman

Antworten:

542

Jede abgeleitete Tabelle (AKA-Unterabfrage) muss tatsächlich einen Alias ​​haben. Dh jede Abfrage in Klammern muss mit einem Alias ​​( AS whatever) versehen werden, auf den im Rest der äußeren Abfrage verwiesen werden kann.

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

In Ihrem Fall könnte natürlich die gesamte Abfrage ersetzt werden durch:

SELECT ID FROM TT2
Paul
quelle
21
Richtige Antwort für den angezeigten Sampe-Code, aber nicht die Lösung für die meisten Benutzer, die diese Frage nachschlagen.
ToBe
1
@ToBe Ich bin gespannt was du damit gemeint hast? Die Antwort gilt für jede Abfrage: Wenn Sie eine abgeleitete Tabelle in Ihrer from-Klausel haben, müssen Sie ihr einen Alias ​​geben.
AdamMc331
2
Entschuldigung, ich habe nicht gesehen, dass Sie auch die ursprüngliche Abfrage korrigiert und die ASAnweisungen hinzugefügt haben . Ich dachte, Sie haben nur die Kurzschrift gezeigt. entfernte meine Gegenstimme.
ToBe
Ich denke dasselbe mit @ToBe. Die Antwort lautet wie folgt: "Hier bedeutet abgeleitete Tabelle 'in der FROM-Klausel verwendete Unterabfrage'. Im Fall der Fragesteller sind dies die Unterabfragen in der Klammer. Wenn Sie den Alias ​​nicht mit dem Schlüsselwort 'as' angeben." Für diese Abfragen kann die DBMS-Abfrage-Engine nicht bestimmen, welche Abfrage was ist, ohne ihre Namen (oder Aliase). Sie müssen daher eindeutige Namen (Aliase) für alle Ihre Unterabfragen angeben, damit die DBMS-Abfrage-Engine ordnungsgemäß funktioniert. "
Bahadir Tasdemir
1
Es wäre besser zu klären, dass die Unterabfrage nicht unbedingt eine abgeleitete Tabelle ist: Sie muss sich direkt in einer FROM-Klausel befinden. Aussagen wie SELECT...FROM...WHERE x NOT IN (subquery) AS Twerden einen Fehler auslösen
Nicholas
76

Ich denke, es fordert Sie auf, dies zu tun:

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

Aber warum sollten Sie diese Abfrage überhaupt schreiben?

Hometoast
quelle
16
Die eigentliche Abfrage ist zu lang. Ich habe sie so gekürzt, dass die Leute hier weniger Zeit haben, sie zu verstehen. Der Fehler bei der kurzen und langen Abfrage war der gleiche.
Silverkid
Ich verstehe jetzt. Ich dachte auch, dass es durch irgendeinen Code erzeugt worden sein könnte. Es sollte sich noch vereinfachen, wie Paul und DMKing vorgeschlagen haben.
Hometoast
9
Wow, ist das wirklich die inakzeptierte zweite Antwort? Für jeden mit dem Problem ist dies die Antwort. MySQL verlangt, dass Sie die "Unterabfrage" kennzeichnen, anstatt sie wie viele andere Implementierungen zu belassen.
Daniel B. Chapman
17

Hier ist ein anderes Beispiel, das ohne Aliase nicht umgeschrieben werden kann (kann nicht GROUP BY DISTINCT).

Stellen Sie sich eine Tabelle mit dem Namen vor purchases, in der Einkäufe von customersat aufgezeichnet werden stores, dh es handelt sich um eine Tabelle mit vielen zu vielen, und die Software muss wissen, welche Kunden in mehr als einem Geschäft Einkäufe getätigt haben:

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

..wird mit dem Fehler brechen Every derived table must have its own alias. Reparieren:

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

(Beachten Sie den AS customAlias).

Neil Stockbridge
quelle
Wie wirkt sich SUM (1) auf die Unterabfrage aus?
xssChauhan