SQL Oracle中子查询的工作
Posted
技术标签:
【中文标题】SQL Oracle中子查询的工作【英文标题】:Working of subquery in SQL Oracle 【发布时间】:2016-11-01 00:34:31 【问题描述】:在处理 SQL 时,我试图了解嵌套或嵌套子查询在 Oracle 中是如何工作的。因此,让我们举一个例子,我有两张表,一张保存所有学生信息,一张保存每个学生的所有成绩。现在我试图从成绩表中找出所有至少获得一个“A”成绩的学生。我可以做一个简单的连接并获得输出。但问题是,如果一个学生两次获得“A”成绩,他的身份证就会出现两次。现在我知道我可以使用 DISTINCT 词来解决我的问题。但我想使用嵌套查询来做到这一点,所以这就是我输入的 -> 从 id 所在的学生中选择 id(从成绩中选择 id); 现在这个查询返回一个没有重复的输出。我正在努力解决这个问题以及这个嵌套查询是如何工作的。 “在哪里”部分也有什么作用?真是一头雾水。
【问题讨论】:
(1) 我删除了不适当的数据库标签。 (2) 您应该编辑问题并提供样本数据和期望的结果。 【参考方案1】:虽然distinct
是一件坏事并不是普遍正确的,但它经常被滥用——我认为你的例子是一个很好的例子,有更好的方法。
在这种情况下,我认为您最好的选择是半联接。这是一个粗略的例子:
select s.*
from students s
where exists (
select null
from grades g
where
s.student_id = g.student_id and
g.grade = 'A'
)
Oracle 在后台将子查询执行到半连接中做得非常好,当它有意义时,但其他 DBMS 肯定会从这种构造中受益。
【讨论】:
是的。非常感谢你的回复!我现在明白了:)【参考方案2】:实际上,它的工作方式是一个连接和一个独特的 - 但 Oracle 很聪明,它可以高效地完成它。它会做你会做的事情:它从第一个表中获取第一个 student_id,并尝试将它与第二个表中的行进行匹配。但是,由于您不需要整个连接,它会在找到匹配项后立即停止 - 然后移动到第一个表中的第二行。
我假设您的意思是子查询是select id from grades where grade = 'A'
,对吧?
【讨论】:
是的。非常感谢你的回复!我现在明白了:)以上是关于SQL Oracle中子查询的工作的主要内容,如果未能解决你的问题,请参考以下文章