【问题标题】:How does Subquery in select statement work in oracle选择语句中的子查询如何在 oracle 中工作
【发布时间】:2013-12-31 17:08:13
【问题描述】:

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

我想知道你是如何在 oracle 的 select 语句中使用子查询的,它究竟输出了什么。

例如,如果我有一个查询想要显示员工的姓名以及他们从这些表中管理的个人资料的数量

雇员(EmpName, EmpId)

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

如何使用子查询?

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

【问题讨论】:

    标签: sql oracle select group-by subquery


    【解决方案1】:

    很简单-

    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 中的子查询不允许传递多于一行和多于一列,这是一个限制。在这里,我们将count 传递给主查询,正如我们所知,它始终只是一个数字——一个标量值。如果未找到值,则子查询将 null 返回到主查询。此外,子查询可以访问主查询的from 子句中的列,如我的查询所示,其中employee.empid 从外部查询传递到内部查询。


    编辑

    当您在select 子句中使用子查询时,Oracle 本质上将其视为左连接(您可以在查询的explain plan 中看到这一点),行的基数只是右侧的一个左边的每一行。


    左连接说明

    左连接非常方便,尤其是当您想替换 select 子查询时,因为它的限制。这里对LEFT JOIN关键字两边的表格行数没有限制。

    更多信息请阅读Oracle Docs on subqueriesleft join or left outer join

    【讨论】:

    • 非常感谢!这真的很有帮助。一个问题。您说子查询不允许传递多于一列,这意味着如果我想添加一个 SUM 函数,我将不得不使用另一个子查询?或者是否可以在选择中有多个子查询?
    • 是的。您可以在选择列表中使用多个子查询。您必须使用另一个子查询来添加 SUM 函数。
    • 重要的是,如果连接表中有几行匹配,则用连接替换子查询可能会导致不同的结果。关于加入 w3schools.com/sql/sql_join.asp 的很好解释
    【解决方案2】:

    在 Oracle RDBMS 中,只要将(子)输出封装为集合,就可以在 select 子句中使用多行子查询。特别是,多行选择子句子查询可以将其每一行输出为封装在 xmlforest 中的 xmlelement。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-21
      • 1970-01-01
      • 2012-07-04
      • 2018-04-03
      相关资源
      最近更新 更多