【发布时间】:2017-01-30 00:35:42
【问题描述】:
我正在阅读 Ben Fortas “在 10 分钟内自学 SQL”一书,它有灰色框警告:“子查询 SELECT 语句只能检索单个列。尝试返回多个列将返回错误。”
事实上,对于 RDMS 来说,这通常是正确的吗? (请注意,如果this answer 正确,则并非所有数据库都正确)。
为什么它会是真的?这似乎是一个奇怪的语言限制。查询的计算成本很高,检索 3 列的工作与检索 1 的工作在计算上并没有特别的不同(除非您的 RDMS 存储按列分组而不是按行分组的表)。
【问题讨论】:
-
在 SELECT 字段或非集合比较(如
=、<等...)中使用子查询结果时一般不成立except。 -
是关于
SELECT子句中的子查询吗? -
从您的描述来看,他似乎在谈论列定义中的子查询,而不是在您发布的链接中作为 FROM 语句中的派生表的子选择/查询。一列不能容纳多列。并且 Column 不能容纳多行,因此在列定义中使用时它必须是单个标量结果。除非使用 IN,否则在 where 或 order by 子句中使用类似的限制
-
我不拥有那本书,也不知道上下文。如果您执行
WHERE foo IN (SELECT ...)之类的操作,那么原因很明显。否则,该限制不存在。 -
它描述了一个标准的
in (...)结构,所以一般的说法显然是错误的。不过,对于那个特定的 sql 语句来说确实如此。这是误导。
标签: mysql sql sql-server postgresql sqlite