admin

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

sql

我到处都在寻找解释,以了解选择语句中的子查询如何工作,但由于解释非常模糊,我仍然无法理解该概念。

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

例如,如果我有一个查询,希望显示这些表中员工的姓名及其管理的个人资料数量

员工(EmpName,EmpId)

Profile(ProfileId,…,EmpId)

如何使用子查询?

我当时想在select语句中需要一个子查询,以实现按功能分组以计算每个员工管理的个人档案的数量,但是我不太确定。


阅读 129

收藏
2021-05-10

共1个答案

admin

这很简单-

SELECT empname,
       empid,
       (SELECT COUNT (profileid)
          FROM profile
         WHERE profile.empid = employee.empid)
           AS number_of_profiles
  FROM employee;

当您使用表联接时,它甚至更简单:

  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;

子查询的解释:

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


编辑

当在select子句中使用子查询时,Oracle实质上将其视为左联接(您可以在查询的解释计划中看到此联接),并且行的基数仅在左边的每一行的右边。


左联接的说明

左联接非常方便,尤其是select由于其限制而要替换子查询时。在此,LEFT JOIN关键字两侧的表行数没有限制。

2021-05-10