select语句中的子查询如何在oracle中工作

use*_*901 19 sql oracle select group-by subquery

我一直在寻找一个解释,一个select语句中的子查询如何工作,但由于非常含糊的解释,我仍然无法理解这个概念.

我想知道如何在oracle中的select语句中使用子查询以及它输出的确切内容.

例如,如果我有一个想要显示员工姓名的查询以及他们从这些表中管理的配置文件数

员工(EmpName,EmpId)

个人资料(ProfileId,...,EmpId)

我如何使用子查询?

我认为在select语句中需要一个子查询来实现按功能分组来计算每个员工管理的配置文件的数量,但我不太确定.

Rac*_*cha 28

这很简单-

SELECT empname,
       empid,
       (SELECT COUNT (profileid)
          FROM profile
         WHERE profile.empid = employee.empid)
           AS number_of_profiles
  FROM employee;
Run Code Online (Sandbox Code Playgroud)

当你使用像这样的表连接时,它甚至更简单:

  SELECT e.empname, e.empid, COUNT (p.profileid) AS number_of_profiles
    FROM employee e LEFT JOIN profile p ON e.empid = p.empid
GROUP BY e.empname, e.empid;
Run Code Online (Sandbox Code Playgroud)

子查询的说明:

实质上,a中的子查询select获取标量值并将其传递给主查询.子查询select不允许传递多个行和多个列,这是一个限制.在这里,我们传递一个count主查询,正如我们所知,它总是只是一个数字 - 一个标量值.如果未找到值,则子查询将返回null主查询.此外,子查询可以从from主查询的子句访问列,如我的查询所示,其中employee.empid从外部查询传递到内部查询.


编辑:

select子句中使用子查询时,Oracle基本上将其视为左连接(您可以在查询的解释计划中看到这一点),左侧每行的行的基数只有一个.


左连接的说明

左连接非常方便,尤其是当您select因为其限制而要替换子查询时.此处对LEFT JOIN关键字两侧的表行数没有限制.

有关更多信息,请阅读子查询上的Oracle Docs以及左连接或左外连接.