Я довольно любитель с SQL (я учитель, а не программист) и написал код, который работал в SQLITE, но не работает в MYSQL. У меня есть таблица под названием «баллы» с именами учеников, упражнениями и баллами. Я не только возвращаю выполненные упражнения, но и хочу вернуть незавершенные. Для этого я использовал CROSS JOIN для создания всех комбинаций ученика и упражнения. В SQLITE это возвращало нулевые значения для студентов, которые не выполнили конкретное упражнение, что полезно.
Используя этот код в MYSQL, он жалуется, что «Каждая производная таблица должна иметь свой собственный псевдоним».
Насколько я понимаю, это означает, что подзапрос должен иметь термин "AS...". Однако независимо от того, где я добавляю его, я все равно получаю эту ошибку. Я пробовал онлайн-валидаторы SQL, чтобы помочь мне, но все равно безуспешно.
Может ли кто-нибудь помочь улучшить мой код, пожалуйста? Спасибо
SELECT othertable.name , othertable.exercise, scores.score
from ((select distinct name from scores)
CROSS JOIN (select distinct exercise from scores)) AS othertable
left join scores
on(scores.name = othertable.name AND scores.exercise = othertable.exercise )
order by othertable.name, othertable.exercise
Сервер должен иметь возможность обратиться к любому столбцу по его полному имени db.table.column
в любой точке запроса, т.е. указать псевдоним таблицы/подзапроса для любого существующего столбца в любой точке, где этот столбец виден. В вашем коде столбцы, созданные двумя подзапросами (select distinct column from scores)
, не соответствуют этому правилу на уровне CROSS JOIN, который их объединяет.
Большое спасибо Алексею и Акине.
Проблема с вашим кодом заключается в том, что говорит ошибка, в MySql вы должны установить псевдоним для каждого подзапроса вашего запроса. Но вместо псевдонимов двух перекрестно соединенных подзапросов и результата их объединения отбросьте круглые скобки подзапросов и используйте 3 псевдонима:
SELECT n.name, e.exercise, s.score
FROM (SELECT DISTINCT name FROM scores) AS n
CROSS JOIN (SELECT DISTINCT exercise FROM scores) AS e
LEFT JOIN scores AS s
ON s.name = n.name AND s.exercise = e.exercise
ORDER BY n.name, e.exercise
(select distinct name from scores) AS alias_here