#mysql #metabase #otrs
#mysql #подзапрос #зависимый от mysql подзапрос #mysql-ошибка-1248
Вопрос:
Я запускаю этот запрос в MySQL
SELECT ID FROM ( SELECT ID, msisdn FROM ( SELECT * FROM TT2 ) );
и это дает эту ошибку:
Каждая производная таблица должна иметь свой собственный псевдоним.
В чем причина этой ошибки?
Комментарии:
1. Не могли бы вы просто упростить это как «выбрать идентификатор из TT2»?
2. Недавно я получил эту ошибку, потому что у меня была дополнительная
)
ошибка в запросе с большим количествомUNION ALL
s.3. Учитывая, что это поиск в Google № 1… Принятый ответ на самом деле не отвечает на ошибку «Каждая производная таблица должна иметь свой собственный псевдоним». Смотрите ниже для получения дополнительной информации.
Ответ №1:
Каждая производная таблица (она же подзапрос) действительно должна иметь псевдоним. Т. Е. Каждому запросу в скобках должен быть присвоен псевдоним ( AS whatever
), который можно использовать для ссылки на него в остальной части внешнего запроса.
SELECT ID FROM ( SELECT ID, msisdn FROM ( SELECT * FROM TT2 ) AS T ) AS T
В вашем случае, конечно, весь запрос может быть заменен на:
SELECT ID FROM TT2
Комментарии:
1. Правильный ответ для показанного кода sampe, но не решение для большинства пользователей, которые задают этот вопрос.
2. @ToBe Мне любопытно, что вы имели в виду под этим? В любом запросе верен ответ, что если у вас есть производная таблица в предложении from, вам нужно присвоить ей псевдоним.
3. Извините, я не видел, как вы также исправили исходный запрос и добавили
AS
инструкции. Я думал, ты показывал только стенографию. убрал мой голос вниз.4. Я думаю о том же с @ToBe. Ответ таков: «Здесь производная таблица означает» подзапрос, используемый в предложении FROM». В случае вопрошающих; они являются подзапросами внутри круглых скобок. Если вы не укажете псевдоним, используя ключевое слово » как «для этих запросов, механизм запросов субд не сможет определить, какой запрос является тем, что без их имен (или псевдонимов), поэтому вы должны указать уникальные имена (псевдонимы) для всех ваших подзапросов, чтобы механизм запросов субд работал правильно».
5. Было бы лучше уточнить, что подзапрос не обязательно является производной таблицей: он должен находиться непосредственно в предложении FROM. Такие утверждения, как
SELECT...FROM...WHERE x NOT IN (subquery) AS T
вызовут ошибку
Ответ №2:
Я думаю, что он просит тебя сделать это:
SELECT ID FROM (SELECT ID, msisdn FROM (SELECT * FROM TT2) as myalias ) as anotheralias;
Но зачем вы вообще написали этот запрос?
Комментарии:
1. сам запрос слишком длинный.. я сократил его достаточно, чтобы у людей здесь было меньше времени на его понимание. ошибка в коротком и длинном запросе была одинаковой.
2. Теперь я понимаю. Я также подумал, что это могло быть сгенерировано каким-то кодом. Это все равно должно быть проще, как предлагали Пол и DMKing.
3. Вау, это действительно неприемлемый второй ответ? Для всех, у кого есть проблема, это ответ, MySQL требует, чтобы вы помечали «подзапрос», а не просто оставляли его, как многие другие реализации.
Ответ №3:
Вот другой пример, который нельзя переписать без псевдонимов ( не может GROUP BY DISTINCT
).
Представьте себе таблицу под названием purchases
, в которой записываются покупки, сделанные customers
at stores
, т. Е. Это таблица «многие ко многим», и программное обеспечение должно знать, какие клиенты совершили покупки в более чем одном магазине:
SELECT DISTINCT customer_id, SUM(1) FROM ( SELECT DISTINCT customer_id, store_id FROM purchases) GROUP BY customer_id HAVING 1 lt; 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 lt; SUM(1);
( Обратите внимание на AS custom
псевдоним).
Комментарии:
1. Каково влияние СУММЫ(1) на подзапрос?
2. Ты спасла мне день. Это сработало для меня. Спасибо.
Ответ №4:
Я прибыл сюда, потому что подумал, что мне следует проверить, есть ли адекватные ответы, после синтаксической ошибки, которая привела меня к этой ошибке, или если бы я мог сам опубликовать ответ.
Хорошо, ответы здесь объясняют, в чем заключается эта ошибка, так что больше нечего сказать, но тем не менее я дам свои 2 цента, используя свои собственные слова:
Эта ошибка вызвана тем фактом, что вы в основном создаете новую таблицу с вашим подзапросом для FROM
команды.
Вот что такое a derived table
, и как таковой, он должен иметь alias
(на самом деле ссылку на имя).
Учитывая следующий гипотетический запрос:
SELECT id, key1 FROM ( SELECT t1.ID id, t2.key1 key1, t2.key2 key2, t2.key3 key3 FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id WHERE t2.key3 = 'some-value' ) AS tt
В конце всего подзапроса внутри FROM
команды будет создана таблица с псевдонимами as tt
, в которой будут следующие столбцы id
, key1
, key2
, key3
.
Затем, с начальной SELECT
, мы, наконец, выбираем id
и key1
из этой сгенерированной таблицы ( tt
).