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中子查询的工作的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE LEFT JOIN 子查询 在SQL SERVER中可以使用如图中的子查询,ORACLE中怎么实现

oracle子查询问题,急急急!

如何提高子查询的性能或 sql 中子查询的替代方案

检查查询是不是包含 oracle 中子查询的所有值

高手来oracle 子查询去重

Oracle SQL - 子查询工作正常,但是使用该子查询创建表似乎挂起