Попробуйте выбрать равенство вопроса правильному ответу. Я предполагаю, что у вас есть тесты студента в одной таблице и ключ в другой; что-то вроде этого должно работать:
select student_test.student_id,
student_test.test_id,
student_test.question_id,
(student_test.answer == test_key.answer OR (student_test.answer IS NULL AND test_key.answer IS NULL))
from student_test
INNER JOIN test_key
ON student_test.test_id = test_key.test_id
AND student_test.question_id = test_key.question_id
WHERE student_test.test_id = <the test to grade>
Вы можете сгруппировать результаты по ученикам и тестам, а затем суммировать последний столбец, если хотите, чтобы БД дала вам общий балл. Это даст подробный «правильный / неправильный» анализ теста.
РЕДАКТИРОВАТЬ: ответы хранятся в виде непрерывной строки, что делает его намного сложнее. Скорее всего, вам придется реализовать это процедурным способом с помощью курсора, то есть ответы каждого учащегося загружаются, помещаются в varchar (1) и сравниваются с ключом в режиме RBAR (строка с агонизирующей строкой). Вы также можете реализовать скалярную функцию, которая сравнивает строку A со строкой B по одному символу за раз и возвращает количество различий, а затем вызывает эту функцию из основного запроса, который будет вызывать эту функцию для каждого учащегося.