如何解决select 语句中的子查询与 FROM 语句中的子查询
因此,如果我使用子查询在 FROM 中定义表,则子查询几乎可以是任何内容:
FROM (SELECT x FROM table)
但是如果我想在 SELECT 子句中使用子查询,它似乎有更多的限制,例如
SELECT (SELECT x FROM table) AS x
可以引发错误
子查询返回超过 1 行
如果有多行。
为什么 SELECT 子句中的子查询不能有单列多行?如果它不能接受多行,为什么我不能使用 MAX() 之类的东西将行聚合为一个值?
例如,查询 (1) 有效而 (2) 无效。
查询 1:
SELECT
(SELECT salary FROM Employee
LIMIT 1 OFFSET 1) AS salary;
查询 2:
SELECT
MAX(SELECT salary FROM Employee) AS salary;
解决方法
SQL 支持各种类型的子查询。一个非常重要的区别是:
-
派生表,它们是
FROM
子句中的子查询,可返回可以具有多行多列的结果集。 - 标量子查询,通常返回一列和最多一行。
您在SELECT
子句中描述的“子查询是标量子查询。该值是对文字值的替换,因此它只能返回一列。如果标量返回零行,则值为 NULL
。
请注意,标量子查询有时会扩展为支持多列。在这种情况下,返回值实际上是一个 元组,因此该值仍然是“一件事”。但那个东西可以有多个字段,如结构体或记录多种编程语言。
,您可以将子查询包含为 SELECT 表达式,只要它只返回 ONE 值即可。为什么?因为 SELECT 子句定义了如何计算返回行集的 EACH ROW 的值。
因此,查询 nº2 是正确的,但应该这样写:
SELECT (SELECT MAX(salary) FROM Employee) AS salary;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。