#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