#sql
#sql
Вопрос:
В этом есть только одна таблица с тремя столбцами student, lect и score. для каждой лекции мне нужно найти студентов, которые не получили ни одного балла.
Я написал приведенный ниже запрос, который использует внешние соединения, но он может делать это только для одного лекта за раз.
Например: см. Ниже, Я передал ‘L02’
Как мне заставить это работать для всех значений lect, таких как (L01, L02, L03 … и т.д.)
select distinct * from
(
select distinct Student from import1
where lect ='L02'
)i1
right outer join
(select distinct Student from import1) i2
on i1.Student=i2.Student
where i1.Student is null
вывод выше
Это работает для L02. Но, как мне изменить выше, чтобы включить для всех значений lect без жесткого кодирования значений lect?
Образец данных из таблицы:
Комментарии:
1. как здесь не определяется оценка? будет ли столбец оценки пустым или иметь нулевое значение?
2. хорошо … извините, я должен был добавить эту информацию.. студент без оценки означает, что его имя будет отсутствовать в таблице для этой конкретной лекции. Итак, мы должны искать ученика, чье имя не отображается в L01. ИТАК, скажем, студент «А» не получил оценку за L01, тогда его записи не будет там для L01. Итак, мы смотрим на студентов, которые не были оценены за эти лекции.
3. Это невозможно, если у вас есть только одна таблица. Вам нужна отдельная таблица students, чтобы отслеживать общее количество студентов. Затем внешнее соединение для полного набора студентов и таблицы лекций и фильтрация для тех, кого нет в таблице лекций.
4. Спасибо за ваш быстрый ответ……. Я могу делать это только для одной лекции за раз.. Но не для всех …
5. Прямо сейчас ur join выдает результаты студентов, которые посещали другие лекции, кроме lec2. Рассмотрим студента, который не посещал никаких лекций… они не появятся в результатах запроса ur.
Ответ №1:
Нужен набор данных всех возможных пар студент / лекция. Если одна таблица содержит всех студентов и лекции, которые необходимо учитывать, этот набор данных может быть построен с:
SELECT Student, Lect FROM (SELECT DISTINCT Student FROM import1) AS S, (SELECT DISTINCT Lect FROM import1) AS L
В противном случае потребуется таблица всех студентов и таблица всех лекций, а затем запрос:
SELECT Student, Lect FROM Students, Lectures
Теперь присоедините этот запрос к таблице оценок с помощью составной ссылки в обоих полях идентификатора и используйте соответствующие критерии фильтрации.
SELECT Query1.Student, Query1.Lect, import1.Score
FROM Query1 LEFT JOIN import1
ON (Query1.Lect = import1.Lect) AND (Query1.Student = import1.Student)
WHERE Score Is Null;
Протестировано с базой данных Access.