混淆多行子查询比较
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了混淆多行子查询比较相关的知识,希望对你有一定的参考价值。
我现在正在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)
当我搜索实际拥有类的教师时,我的代码可以工作(返回教师的所需输出),但是当我搜索没有类的教师时,它无法识别。我不太确定如何解决这个问题,任何帮助表示赞赏。
答案
您可以使用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
另一答案
默认连接是INNER,这意味着只返回教师ID匹配的节中的行。您可能想要指定LEFT OUTER JOIN [1]。另一个常见的构造是使用WHERE NOT EXISTS [2]
[1] What is the difference between "INNER JOIN" and "OUTER JOIN"?
另一答案
以下是从未教过任何课程的教师。将'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
另一答案
从已教授的教师的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
)
以上是关于混淆多行子查询比较的主要内容,如果未能解决你的问题,请参考以下文章