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

256

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

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

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

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

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

  • 13
    Не могли бы вы просто упростить это как «выбрать ID из TT2»?
  • 3
    Я недавно получил эту ошибку, потому что у меня было дополнительное ) в запросе с большим количеством UNION ALL .
Показать ещё 1 комментарий
Теги:
mysql-error-1248

3 ответа

347
Лучший ответ

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

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

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

SELECT ID FROM TT2
  • 19
    Правильный ответ для показанного кода sampe, но не решение для большинства пользователей, ищущих этот вопрос.
  • 1
    @ ToBe Мне интересно, что ты имел в виду? Ответ верен в любом запросе: если у вас есть производная таблица в предложении from, вам нужно дать ей псевдоним.
Показать ещё 3 комментария
59

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

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

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

  • 12
    фактический запрос слишком длинный .. я сократил его настолько, что у людей здесь меньше времени на его понимание. ошибка в коротком и длинном запросе была одинаковой.
  • 0
    Теперь я понимаю. Я также думал, что это могло быть сгенерировано каким-то кодом. Это все еще должно упростить, как полагали Пол и ДМКинг.
Показать ещё 1 комментарий
11

Вот другой пример, который нельзя переписать без псевдонимов (не может 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).

  • 0
    Как SUM (1) влияет на подзапрос?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню