Вопрос SQL: Покажите мне студентов, которые НЕ прошли определенный курс? - PullRequest
2 голосов
/ 08 июля 2010

Итак, у меня есть следующие таблицы:

СТУДЕНТЫ: Студенческий билет - Имя - Фамилия - Электронная почта

КУРСЫ: ID каталога - Название курса - Описание

УСЛОВИЯ:Термин ID - Дата начала - Дата окончания

COURSEINSTANCES: ID CourseInstance - Идентификатор каталога - ID Term

STUDENTCOURSES: Идентификатор StudentCourse - ID CourseInstance - Идентификатор Student - Дата добавлена ​​в базу данных

Это позволяет легко увидеть, какие студенты прошли какие курсы.Я не уверен, как узнать, какие студенты НЕ прошли определенный курс.

Делая что-то вроде этого:

WHERE ((CourseInstances.CatalogLookup)<>504)

просто даст мне список курсов, которые проходят студенты, которые не соответствуют каталожному номеру 504, например:

Тара - 501

Тара - 502

Тара - 505

Джон - 503

Так, например, я взял 504. Поэтому яне хочу, чтобы я появлялся в этом списке.Приведенный выше SQL просто покажет все мои курсы, не относящиеся к 504, но не исключит меня из списка.

Есть идеи?Это возможно?

Ответы [ 6 ]

8 голосов
/ 08 июля 2010

Я предпочитаю этот синтаксис перед внешними объединениями, IMO легче читать:

select * 
from STUDENTS 
where StudentID not in 
(
    select StudentID 
    from STUDENTCOURSES s 
    inner join COURSEINSTANCES c on s.CourseInstanceID  = c.CourseInstanceID 
    where c.CatalogID = 504
)

Во вложенном запросе вы выбираете идентификаторы StudentID всех студентов, которые прошли курс 504.

Затем вы выбираете всех учеников, чьи StudentID не включены во вложенный запрос.

РЕДАКТИРОВАТЬ:
Как уже сказал ChrisJ, c и s являются псевдонимами для имен таблиц..
Без них запрос выглядел бы так:

select * 
from STUDENTS 
where StudentID not in 
(
    select StudentID 
    from STUDENTCOURSES 
    inner join COURSEINSTANCES on STUDENTCOURSES.CourseInstanceID = COURSEINSTANCES.CourseInstanceID 
    where CatalogID = 504
)

Я всегда использую псевдонимы, потому что:
a) Мне лень набирать имена таблиц чаще, чем необходимо.
б) На мой взгляд, читать легче, особенно когда вы объединяете таблицы с длинными именами.

2 голосов
/ 08 июля 2010

Попробуйте что-то вроде этого:

SELECT * 
FROM Users 
WHERE UserID NOT IN
( SELECT UserID
  FROM 
    Users
  INNER JOIN
    ClassesTaken ON Users.UserID = ClassesTaken.UserID AND ClassesTaken.ClassNumber = 504)

Другой способ произошел со мной на днях:

SELECT * 
FROM 
Users
LEFT OUTER JOIN ClassesTaken ON Users.UserID = ClassesTaken.UserID AND ClassesTaken.ClassNumber = 504
WHERE ClassesTaken.UserID IS NULL
2 голосов
/ 08 июля 2010

Вы должны прочитать о внешних соединениях .

1 голос
/ 08 июля 2010
SELECT * FROM students 
WHERE studentId not in 
(SELECT distinct studentID FROM studentCourses WHERE courseInstanceID = 504)
1 голос
/ 08 июля 2010

Три основных способа в Access

  • NOT IN (будьте осторожны, чтобы исключить любые NULL, если есть вероятность их появления в подзапросе)
  • OUTER JOIN и фильтр наNULL (может потребоваться добавить DISTINCT)
  • НЕ СУЩЕСТВУЕТ

Другие РСУБД также имеют EXCEPT или MINUS

0 голосов
/ 08 июля 2010

домашнее задание?используйте операторы множеств.

выберите всех студентов МИНУС выберите любого студента, который прошел этот курс ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...