2009-12-11 8 views
269

Ich betreibe diese Abfrage auf MySQLWas ist der Fehler "Jede abgeleitete Tabelle muss ihren eigenen Alias ​​haben" in MySQL?

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

und es gibt diesen Fehler:

Every derived table must have its own alias.

Was diesen Fehler verursacht?

+13

Könnten Sie das nicht einfach als "ID von TT2 auswählen" vereinfachen? – DMKing

+2

Ich habe diesen Fehler kürzlich bekommen, weil ich ein extra ')' in einer Abfrage mit vielen 'UNION ALL's hatte. – mpen

+9

Sehen, wie dies die # 1 Google-Suche ist ... Die akzeptierte Antwort beantwortet nicht wirklich den Fehler "Jede abgeleitete Tabelle muss ihren eigenen Alias ​​haben". Schaue unten für mehr Informationen. –

Antwort

380

Jede abgeleitete Tabelle (AKA Sub-Query) muss in der Tat einen Alias ​​haben. I.e. Jede Abfrage in Klammern muss einen Alias ​​erhalten (AS whatever), auf den im Rest der äußeren Abfrage Bezug genommen 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 mit Fassung:

SELECT ID FROM TT2 
+16

Richtige Antwort für den gezeigten Beispielcode, aber nicht die Lösung für die meisten Benutzer, die diese Frage nach oben sehen. – ToBe

+1

@Tobe Ich bin neugierig, was du damit meintest? Die Antwort gilt in jeder 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 repariert und die AS-Anweisungen hinzugefügt haben. Ich dachte, du hättest nur die Kurzschrift gezeigt. mein Downvote entfernt. – ToBe

64

Ich denke, es fragt Sie, dies zu tun:

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

Aber warum sollten Sie diese Abfrage an erster Stelle schreiben?

+8

die tatsächliche Abfrage ist zu lang .. Ich habe es genug verkürzt, dass die Menschen hier weniger Zeit haben, es zu verstehen. Der Fehler bei der kurzen und langen Abfrage war gleich. – silverkid

+0

Ich verstehe jetzt. Ich dachte auch, dass es durch irgendeinen Code erzeugt worden sein könnte. Es sollte immer noch vereinfachen, wie Paul und DMKing vorgeschlagen. – hometoast

+8

Wow, ist das wirklich die unakzeptierte zweite Antwort? Für jeden mit dem Problem ist dies die Antwort, MySQL verlangt, dass Sie die "Unterabfrage" beschriften, anstatt sie wie viele andere Implementierungen zu verlassen. –

11

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

einen Tisch Stellen genannt purchases, die von customers bei stores getätigten Käufe erfasst, dh es ist ein viel zu viele Tisch und die Software muss wissen, welche Kunden Einkäufe bei mehr als einem Geschäft gemacht 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 Every derived table must have its own alias brechen. Um dies zu beheben:

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 die AS custom alias).

+0

Was ist der Effekt von SUM (1) auf die Unterabfrage? –

Verwandte Themen