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

Joh*_*son 0 mysql sql sql-server sqlite postgresql

我正在浏览Ben Fortas"在10分钟内自学SQL"一书,并且它有灰色框警告:"子查询SELECT语句只能检索单个列.尝试​​返回多个列将返回错误."

事实上,对于RDMS来说,这通常是正确的吗?(请注意,如果这个答案是正确的,则所有数据库都不是这样).

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

Dav*_*dge 5

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

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

这是一个只能返回单个列的示例.

select (select name from table where id = main_query.id),
       id
from   table main_query
Run Code Online (Sandbox Code Playgroud)

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

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

下面是一个示例,其中返回的列数无关紧要,实际上忽略了任何值:

select id
from   table main_query
where  exists (select a,b
               from   c
               where  c.x = main_query.y);
Run Code Online (Sandbox Code Playgroud)

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

  • 可能希望为多列添加派生表示例.也是EXISTS那种真实,但现实是EXISTS忽略了列定义所以它看到5列,*,SELECT 1都是同一个东西 (2认同)

Gor*_*off 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);
Run Code Online (Sandbox Code Playgroud)

但是,许多子查询不是标量子查询.这些包括:

  • FROM子句中的子查询.
  • a EXISTS和的子查询NOT EXISTS.
  • 在比较中使用的元组运算符的子查询,例如=IN.