Jaki jest błąd „Każda tabela pochodna musi mieć swój własny alias” w MySQL?

386

Używam tego zapytania na MySQL

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

i daje ten błąd:

Każda tabela pochodna musi mieć własny alias.

Co powoduje ten błąd?

silverkid
źródło
14
Czy nie można tego po prostu uprościć jako „wybierz identyfikator z TT2”?
DMKing,
5
Niedawno dostałem ten błąd, ponieważ miałem dodatkowe )zapytanie w wielu UNION ALLs.
mpen
10
Widząc, jak to jest wyszukiwanie nr 1 w Google ... Akceptowana odpowiedź tak naprawdę nie odpowiada na błąd „Każda tabela pochodna musi mieć własny alias”. Spójrz poniżej, aby uzyskać więcej informacji.
Daniel B. Chapman

Odpowiedzi:

542

Każda tabela pochodna (zapytanie podrzędne AKA) musi rzeczywiście mieć alias. Oznacza to, że każde zapytanie w nawiasach musi mieć alias ( AS whatever), którego można użyć do odwołania się do niego w pozostałej części zapytania zewnętrznego.

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

W twoim przypadku oczywiście całe zapytanie można zastąpić:

SELECT ID FROM TT2
Paweł
źródło
21
Prawidłowa odpowiedź na wyświetlony kod sampe, ale nie rozwiązanie dla większości użytkowników szukających tego pytania.
ToBe
1
@ToBe Jestem ciekawy, co masz na myśli? Odpowiedź jest prawdziwa w każdym zapytaniu, że jeśli masz tabelę pochodną w klauzuli from, musisz nadać jej alias.
AdamMc331
2
Przepraszam, nie widziałem, że naprawiłeś również oryginalne zapytanie i dodałeś ASinstrukcje. Myślałem, że pokazałeś tylko stenografię. usunąłem moją opinię.
ToBe
Myślę tak samo z @ToBe. Odpowiedź jest następująca: „Tutaj tabela pochodna oznacza„ zapytanie cząstkowe użyte w klauzuli FROM ”. W przypadku pytających są to zapytania wewnętrzne w nawiasach. Jeśli alias nie zostanie podany przy użyciu słowa kluczowego„ jako ” w przypadku tych zapytań silnik zapytań dbms nie może ustalić, które zapytanie jest bez ich nazw (lub aliasów), dlatego należy podać unikalne nazwy (aliasy) dla wszystkich pod-zapytań, aby silnik zapytań dbms działał poprawnie. ”
Bahadir Tasdemir,
1
Lepiej byłoby wyjaśnić, że podzapytanie niekoniecznie jest tabelą pochodną: musi znajdować się bezpośrednio w klauzuli FROM. Takie stwierdzenia SELECT...FROM...WHERE x NOT IN (subquery) AS Tspowodują błąd
Nicholas
76

Myślę, że prosi cię o to:

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

Ale dlaczego miałbyś pisać to zapytanie?

hometoast
źródło
16
rzeczywiste zapytanie jest za długie .. Skróciłem je na tyle, że ludzie tutaj mają mniej czasu na jego zrozumienie. błąd w krótkim i długim zapytaniu był taki sam.
silverkid
Teraz rozumiem. Myślałem również, że mógł zostać wygenerowany przez jakiś kod. Powinno to nadal upraszczać, jak sugerowali Paul i DMKing.
hometoast
9
Wow, czy to naprawdę nieakceptowana druga odpowiedź? Dla każdego, kto ma problem, taka jest odpowiedź, MySQL wymaga oznaczenia „zapytania podrzędnego” zamiast pozostawiania go tak jak wielu innym implementacjom.
Daniel B. Chapman
17

Oto inny przykład, którego nie można przepisać bez aliasów (nie można GROUP BY DISTINCT).

Wyobraź sobie tabelę, purchasesktóra rejestruje zakupy dokonane przez customersat stores, tzn. Jest to tabela od wielu do wielu, a oprogramowanie musi wiedzieć, którzy klienci dokonali zakupów w więcej niż jednym sklepie:

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

... zepsuje się z błędem Every derived table must have its own alias. Naprawić:

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

(Zwróć uwagę na AS customalias).

Neil Stockbridge
źródło
Jaki jest wpływ SUM (1) na podzapytanie?
xssChauhan