Код ошибки: 1093. Вы не можете указать целевую таблицу 'c' для обновления в предложении FROM - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь подготовиться к тематическим собеседованиям, и пока я пытался решить эту проблему, я столкнулся с некоторыми проблемами в последнем упражнении C).

enter image description here

Я заново создал эти таблицы в своей локальной базе данных "labsd", и это мое решение для

A)

SELECT  labsd.interns.email,labsd.grades.grade
from labsd.grades
Inner join labsd.interns on labsd.interns.id=labsd.grades.id
Order by labsd.grades.grade desc
Limit 10;

B)

SELECT count(labsd.grades.id),labsd.grades.grade
from grades
group by labsd.grades.grade
order by count(labsd.grades.id) desc;

И вот в чем проблема

C)

Update labsd.interns as c
Set c.Accepted=1
where labsd.interns.id In (SELECT  labsd.interns.id
from labsd.grades
Inner join labsd.interns on labsd.interns.id=labsd.grades.id
Order by labsd.grades.grade desc);

Учитывая, что в первый момент меня спросили о 10 лучших учениках, я подумал, что мне следует повторно использовать этот код, но я больше не могу использовать Limit, и я получил следующую ошибку:

Error Code: 1235. This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

Я не знаю, как найти, какую версию MySql я только что установил в этом семестре, поэтому я предполагаю, что это последняя версия.

И даже без ограничения я все равно получаю ошибку, упомянутую в названии. Я попытался переименовать таблицу, но это не решило мою проблему.

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

MySQL не разрешает синтаксис, который вы пытаетесь использовать. Вместо этого вы можете использовать синтаксис update / join следующим образом:

update labsd.interns s
inner join (
    select i.id
    from labsd.grades g
    inner join labsd.interns i on i.id = g.id
    order by g.grade desc limit 10
) t on t.id = s.id
set s.accepted = 1

Подзапрос перечисляет id из 10 лучших кандидатов, затем внешний запрос объединяет результаты подзапроса с исходной таблицей. , an устанавливает флаги в соответствующих строках.

0 голосов
/ 31 марта 2020

Вы не можете назначить псевдоним в части обновления.

Полностью удалить псевдоним,

Update labsd.interns Set Accepted=1

или переписать запрос для перемещения as c в оператор соединения.

UPDATE c SET Accepted = 1 FROM labsd.grades as g JOIN labsd.interns AS c ON c.id = g.id;

Обратите внимание, что в подзапросе также не может быть Order By без предложения top.

...