当前位置: 首页 > 面试题库 >

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

白赞
2023-03-14
问题内容

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

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

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

员工(EmpName,EmpId)

Profile(ProfileId,…,EmpId)

如何使用子查询?

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


问题答案:

这很简单-

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关键字两侧的表行数没有限制。

有关更多信息,请阅读有关子查询和左联接或左外部联接的Oracle文档。



 类似资料:
  • 问题内容: 所以我试图解决这个问题,但似乎最后一行(检查)不允许在其中进行子查询。有什么办法可以使Oracle工作吗? 这是错误信息: 问题答案: 由于CHECK约束不能基于查询,因此有三种基本方法可以解决此类问题。 选项1:触发器 最简单的方法是在TANK上放置一个触发器,以查询TANKS并在LEVEL超过CAPACITY时引发异常。但是,这种简单化方法的问题在于,几乎不可能正确处理并发问题。如

  • 问题内容: 将SELECT查询放在UPDATE查询的WHERE子句中时出现错误。 我的查询是这样的: AND错误将显示如下: “无法在FROM子句中指定目标表’m’进行更新” 问题答案: 实际上,您可以通过将其包装在子查询中来更新它(从而为结果创建临时表) 或使用 JOIN

  • 问题内容: 当我们执行此操作时,将不会有任何结果 我的问题是: 以上查询在逻辑上等效于 就像上面的声明一样,不会有任何结果 请说清楚? 问题答案: 正确(但请注意,这是一个运算符,而不是一个子句,它通常在SQL中这样工作,不仅适用于Oracle)。 等效于: 实际应该写成: 和 与以下内容相同: 结果为: 并进一步作为: 因此,它正确不返回任何行。 请注意,如果您有,它将评估为(在练习中保留),并

  • 来自Teradata,我通常会创建一个包含一些变量的易失性表,我会在代码中使用这些变量。 例如。, 然后我会在SELECT WHERE子句中使用该表: 我试图在色调(Impala editor)中执行类似的操作,但遇到了一个错误: AnalysisException:第5行中的语法错误:未定义:来自表名隐藏^遇到:来自预期的:大小写、强制转换、默认值、存在、FALSE、IF、INTERVAL、NO

  • 主要内容:Oracle SELECT示例在本教程中,将学习如何使用Oracle SELECT语句从单个表中查询数据。 在Oracle中,表是由列和行组成。 例如,示例数据库中的表具有以下列:,,,和。表中这些列中也有对应的数据。 要从表的一个或多个列(,,,)中检索数据,请使用以下语法的语句: 在这个语句中: 首先,需要指定要查询数据的表名。 其次,指定想要返回数据的列。 如果需要返回多个列,则需要用逗号()将这些列分隔。 请注意,SE

  • 问题内容: 给定一个表名和一个列名,我试图动态删除一个我事先不知道名称的Oracle约束。 我可以通过以下查询找到约束名称: 我的第一个想法是使用子查询,但这不起作用,并导致ORA-02250错误: 到目前为止,我唯一可行的解​​决方案是以下解决方案,但感觉不必要的复杂: 是否有一种方法可以像我最初打算的那样使用子查询来做到这一点?如果不是,那么有人可以建议一种更简洁的方法吗? 问题答案: 你不能