混淆多行子查询比较

时间:2018-03-01 22:13:35

标签: sql oracle subquery

我现在正在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) 

当我搜索实际拥有课程的教师时,我的代码可以正常工作(为教师返回所需的输出),但是当我搜索没有课程的教师时,它无法识别。我不太确定如何解决这个问题,感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

默认联接是INNER,这意味着只返回教师ID匹配的部分中的行。您可能想要指定LEFT OUTER JOIN [1]。另一个常见的构造是使用WHERE NOT EXISTS [2]

[1] What is the difference between "INNER JOIN" and "OUTER JOIN"?

[2] NOT IN vs NOT EXISTS

答案 1 :(得分:1)

您可以使用NOT EXISTS来获取Section表中没有的教师。

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

答案 2 :(得分:1)

以下是从未教过任何课程的教师。将'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

答案 3 :(得分:1)

从已教授的教师的Section表中获取ID列表。使用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
)