У чому полягає помилка “Кожна похідна таблиця повинна мати власний псевдонім” у MySQL?


386

Я веду цей запит на MySQL

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

і це дає цю помилку:

Кожна похідна таблиця повинна мати свій псевдонім.

Що викликає цю помилку?


14
Не могли ви просто спростити це як "вибрати ідентифікатор від TT2"?
DMKing

5
Нещодавно я отримав цю помилку, оскільки у мене був додатковий )запит з великою кількістю UNION ALLs.
квітня 12

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 Мені цікаво, що ти мав на увазі під цим? Відповідь справедлива в будь-якому запиті, що якщо у вас є похідна таблиця у вашому пункті, вам потрібно дати їй псевдонім.
AdamMc331

2
Вибачте, я не бачив, що ви також виправили оригінальний запит і додали ASзаяви. Я думав, ти лише показав стенограму. зняв мій потік.
ToBe

Я думаю про те саме з @ToBe. Відповідь така: "Тут похідна таблиця означає" підзапит, який використовується у пункті FROM ". У випадку запитуючих; це підзапити в дужках. Якщо ви не вказали псевдонім, використовуючи ключове слово" як " для цих запитів механізм запитів 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;

Але чому б ви писали цей запит в першу чергу?


16
фактичний запит занадто довгий .. я скоротив його досить, щоб люди тут мали менше часу на його розуміння. помилка в короткому та довгому запиті була однаковою.
silverkid

Я тепер розумію. Я також думав, що це може бути породжене якимсь кодом. Це все ж має спрощуватися, як запропонували Пол та DMKing.
рідний схід

9
Вау, це справді неприйнята друга відповідь? Для тих, хто має проблему, це відповідь, MySQL вимагає відзначити "підзапит", а не просто залишати його, як і багато інших реалізацій.
Даніель Б. Чапман

17

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


Який вплив SUM (1) на підзапит?
xssChauhan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.