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

386

Я выполняю этот запрос на MySQL

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

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

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

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

silverkid
источник
14
Не могли бы вы просто упростить это как «выбрать ID из TT2»?
DMKing
5
Я недавно получил эту ошибку, потому что у меня было дополнительное )в запросе с большим количеством UNION ALLs.
mpen
10
Видя, что это # ​​1 поиск Google ... Принятый ответ на самом деле не отвечает на ошибку «Каждая производная таблица должна иметь свой собственный псевдоним». Смотрите ниже для получения дополнительной информации.
Дэниел Б. Чепмен

Ответы:

542

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

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

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

SELECT ID FROM TT2
Павел
источник
21
Правильный ответ для показанного кода sampe, но не решение для большинства пользователей, ищущих этот вопрос.
ToBe
1
@ ToBe Мне интересно, что ты имел в виду? Ответ верен в любом запросе: если у вас есть производная таблица в предложении from, вам нужно указать псевдоним.
AdamMc331
2
Извините, я не видел, чтобы вы также исправили исходный запрос и добавили ASутверждения. Я думал, что вы только показали стенографию. убрал мое понижение.
ToBe
Я думаю то же самое с @ToBe. Ответ таков: «Здесь производная таблица означает« подзапрос, используемый в предложении FROM ». В случае спрашивающих; они являются подзапросами внутри круглых скобок. Если вы не указываете псевдоним с помощью ключевого слова« as » для этих запросов механизм запросов dbms не может определить, какой запрос является тем, что без их имен (или псевдонимов), поэтому вы должны дать уникальные имена (псевдонимы) для всех ваших подзапросов, чтобы механизм запросов dbms заставил его работать должным образом. "
Бахадир Тасдемир
1
Было бы лучше уточнить, что подзапрос не обязательно является производной таблицей: он должен находиться непосредственно в предложении FROM. Утверждения, как SELECT...FROM...WHERE x NOT IN (subquery) AS Tбудет вызывать ошибку
Николай
76

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

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

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

hometoast
источник
16
фактический запрос слишком длинный .. я сократил его настолько, что у людей здесь меньше времени для его понимания. ошибка в коротком и длинном запросе была одинаковой.
silverkid
Теперь я понимаю. Я также думал, что это могло быть сгенерировано каким-то кодом. Это все еще должно упростить, как полагали Пол и ДМКинг.
Hometoast
9
Вау, действительно ли это второй неприемлемый ответ? Любой, у кого есть проблема, это ответ, MySQL требует, чтобы вы пометили «подзапрос», а не просто оставили его, как и многие другие реализации.
Даниэль Б. Чепмен
17

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

Представьте себе таблицу, в purchasesкоторой записываются покупки, сделанные в customersat 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псевдоним).

Нил Стокбридж
источник
Как SUM (1) влияет на подзапрос?
xssChauhan