在 SQL Oracle 中使用子查询

Working of subquery in SQL Oracle

我试图了解嵌套或嵌套子查询在处理 SQL 时如何在 Oracle 中工作。举个例子,我有 2 个 table,一个保存所有学生信息,另一个保存每个学生的所有成绩。现在,我试图找到所有在 table 成绩中至少获得一个 'A' 成绩的学生。我可以做一个简单的连接并得到它的输出。但问题是,如果一个学生两次获得 'A' 成绩,他的 ID 就会出现两次。现在我知道我可以使用 DISTINCT 词来解决我的问题。但我想使用嵌套查询来做到这一点,所以这就是我输入的内容 -> select id from students where id in (select id from grades); 现在这个查询 returns 没有重复的输出。我正在努力了解这个问题以及这个嵌套查询的详细工作原理。 "where in" 部分还做什么?真是一头雾水

实际上它的工作方式是连接和区别 - 但 Oracle 很聪明,它可以高效地完成它。它会做你会做的事情:它从第一个 table 中获取第一个 student_id,并尝试将它与第二个 table 中的行匹配。但是,由于您不需要整个连接,它会在找到匹配项后立即停止 - 然后移动到第一行的第二行 table.

我假设你的意思是子查询是 select id from grades where grade = 'A',对吧?

虽然 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 肯定会从这种构造中受益。