声明子查询只能返回单个列

时间:2016-09-21 16:33:20

标签: mysql sql sql-server postgresql sqlite

我要经历Ben Fortas"在10分钟内自学SQL#34;本书并且它有灰色框警告:"子查询SELECT语句只能检索单个列。尝试返回多个列将返回错误。"

事实上,对于RDMS来说,这通常是正确的吗? (请注意,如果this answer正确,那么所有数据库都不是这样。)

为什么这个世界会是真的?这似乎是一种奇怪的语言限制。查询计算起来很昂贵,并且检索3列的工作在计算上与检索1的工作没有特别的不同(除非您的RDMS存储按列分组而不是按行分组的表)。

2 个答案:

答案 0 :(得分:5)

在您链接的答案中,我会将其归类为"内联视图"或"内联查询",而不是子查询。

当然,这提出了一个子查询究竟是什么的问题。

以下是您确实只能返回一列的示例。

select id
from   table main_query
where  (col1, col2) in (select a,b
                        from   c
                        where  c.x = main_query.y);

这是一个可以返回多个列的示例。这似乎是一个明确的子查询,相关的"类型。

select id
from   table main_query
where  exists (select a,b
               from   c
               where  c.x = main_query.y);

以下是一个示例,其中返回的列数并不重要,实际上忽略了任何值:

{{1}}

我认为总的来说,我说这不是真的,但这取决于你对子查询的定义是什么。

答案 1 :(得分:5)

标量子查询只能返回一列。这些是在预期单个值的任何位置使用的子查询。这几乎可以在任何条款中使用。例如,因为这个非敏感的查询使用它们:

select (select count(*) from information_schema.tables), table_name
from information_schema.columns
where table_name = (select table_name from information_schema.columns order by rand() limit 1);

但是,许多子查询不是标量子查询。其中包括:

  • FROM子句中的子查询。
  • EXISTSNOT EXISTS
  • 的子查询
  • =IN等比较中使用元组的运算符的子查询。