Я работаю в Oracle SQL Developer прямо сейчас и нахожусь в тупике на запрос. Приглашение гласит:
Предоставьте алфавитный список инструкторов, которые никогда не преподавали раздел курса. Укажите приветствие, имя, фамилию и почтовый индекс.

Это моя текущая попытка:

SELECT i.Salutation, i.First_Name, i.Last_Name, i.Zip
FROM Instructor i
  JOIN Section s 
    ON i.Instructor_Id = s.Instructor_Id
WHERE 0 in (SELECT COUNT(Instructor_Id)
FROM Section 
GROUP BY Instructor_Id) 

Мой код работает (возвращает желаемый результат для инструкторов), когда я ищу инструкторов, у которых действительно есть классы, но он не распознает, когда я ищу тех, у кого их нет. Я не слишком уверен, как обойти это, любая помощь приветствуется.

0
stasis100t 2 Мар 2018 в 01:13

4 ответа

Лучший ответ

Вы можете использовать NOT EXISTS, чтобы получить инструкторов, которых нет в таблице Разделов.

SELECT 
  Salutation,
  First_Name,
  Last_Name,
  Zip
FROM Instructor i
WHERE NOT EXISTS (
 SELECT
  *
 FROM Section s
 WHERE i.Instructor_Id = s.Instructor_Id)
ORDER BY Last_Name
1
B.Porter 1 Мар 2018 в 22:21

Соединением по умолчанию является INNER, что означает, что возвращаются только строки из раздела, в котором совпадают идентификаторы инструктора. Вы, вероятно, хотите указать LEFT OUTER JOIN [1]. Другая распространенная конструкция для этого - использовать WHERE NOT EXISTS [2]

[1] В чем разница между "ВНУТРЕННЕЕ СОЕДИНЕНИЕ" и "НАРУЖНОЕ СОЕДИНЕНИЕ"?

[2] НЕ В, а НЕ СУЩЕСТВУЕТ

1
Ian McGowan 1 Мар 2018 в 22:21

Следующее находит инструкторов, которые никогда не преподавали никаких курсов. Измените условие условия «HAVING» на > 0, чтобы получить инструкторов, которые читали несколько курсов:

SELECT 
  i.Salutation,
  i.First_Name,
  i.Last_Name,
  i.Zip 
FROM Instructor i
left join section s
on i.instructor_id = s.instructor_id
group by 
i.instructor_id,
i.Salutation,
  i.First_Name,
  i.Last_Name,
  i.Zip  
having count(s.section_id)  = 0 /* > 0 if looking for instructors who have taught some courses */
order by i.last_name, i.first_name
1
kc2018 1 Мар 2018 в 22:59

Получить список идентификаторов из таблицы Раздела для преподавателей, которые преподавали. Используйте NOT IN, чтобы увидеть, кто не преподавал никаких классов.

SELECT i.Salutation, i.First_Name, i.Last_Name, i.Zip
FROM Instructor i
WHERE i.Instructor_Id NOT IN (
    SELECT DISTINCT s.Instructor_Id
    FROM Section
)
1
Daryl Bagley 1 Мар 2018 в 22:59