Какая ошибка "Каждая производная таблица должна иметь свой собственный псевдоним" в MySQL?

Я запускаю этот запрос в MySQL

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

и он дает эту ошибку:

Каждая производная таблица должна иметь свой собственный псевдоним.

Что вызывает эту ошибку?

Ответ 1

Каждая производная таблица (подзапрос AKA) должна иметь псевдоним. То есть каждый запрос в скобках должен иметь псевдоним (AS whatever), который может использоваться для ссылки на него в остальном внешнем запросе.

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

В вашем случае, конечно, весь запрос может быть заменен на:

SELECT ID FROM TT2

Ответ 2

Я думаю, что он просил вас сделать это:

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

Но зачем писать этот запрос в первую очередь?

Ответ 3

Вот другой пример, который нельзя переписать без псевдонимов (не может GROUP BY DISTINCT).

Представьте таблицу с именем purchases, которая записывает покупки, сделанные customers в stores, то есть это много-много таблиц, и программное обеспечение должно знать, какие клиенты совершили покупки в более чем одном магазине:

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

.. будет ломаться с ошибкой Every derived table must have its own alias. Исправить:

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

(Обратите внимание на псевдоним AS custom).