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

#mysql #sqlite

#mysql #sqlite

Вопрос:

Я довольно любитель SQL (я учитель, а не программист) и написал некоторый код, который работал в SQLITE, но не работает в MYSQL. У меня есть таблица под названием «оценки» имен учащихся, упражнений и оценок. Помимо возврата завершенных упражнений, я также хочу вернуть те, которые не были завершены. Для этого я использовал ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ, чтобы сгенерировать все комбинации student и exercise. В SQLITE это возвращало нулевые значения для учащихся, которые не выполнили определенное упражнение, что полезно.

Используя этот код в MYSQL, он жалуется, что «Каждая производная таблица должна иметь свой собственный псевдоним»

Я понимаю, что это означает, что подзапрос должен иметь термин «КАК …». Однако, независимо от того, куда я его добавляю, я все равно получаю эту ошибку. Я пробовал онлайн-валидаторы 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
 

Комментарии:

1. (select distinct name from scores) AS alias_here

2. Сервер должен иметь возможность ссылаться на любой столбец, используя его полное имя db.table.column в любой точке запроса, т.Е. Указывать псевдоним таблицы / подзапроса для любого существующего столбца в любой точке, где этот столбец виден. В вашем коде столбцы, созданные 2 подзапросами (select distinct column from scores) , не соответствуют этому правилу на уровне ПЕРЕКРЕСТНОГО СОЕДИНЕНИЯ, которое их объединяет.

3. Большое вам спасибо, Алекс и Акина

Ответ №1:

Проблема с вашим кодом заключается в том, что говорится в ошибке, в MySQL вы должны установить псевдоним для каждого подзапроса вашего запроса.
Но вместо того, чтобы сглаживать 2 перекрестно соединенных подзапроса и результат их объединения, опустите скобки подзапросов и используйте 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