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

Я довольно любитель с 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
(select distinct name from scores) AS alias_here
Alex K. 14.12.2020 21:27

Сервер должен иметь возможность обратиться к любому столбцу по его полному имени db.table.column в любой точке запроса, т.е. указать псевдоним таблицы/подзапроса для любого существующего столбца в любой точке, где этот столбец виден. В вашем коде столбцы, созданные двумя подзапросами (select distinct column from scores), не соответствуют этому правилу на уровне CROSS JOIN, который их объединяет.

Akina 14.12.2020 21:53

Большое спасибо Алексею и Акине.

user2094585 15.12.2020 11:26
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
3
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема с вашим кодом заключается в том, что говорит ошибка, в 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  

Другие вопросы по теме