您的子查询有两列:标签和大小。这不是一个标量子查询。
错误的解释是选择列表中的每个子查询都必须是标量子查询,这意味着它必须只返回一列和一行。
示例:让我们保持简单并使用字面值查询,因此我们甚至不引用表。我们为选择列表中的每个项目分配一个列别名。
SELECT
123 AS colum1,
456 AS column2,
(SELECT 789, 'abc') AS column3;
但是等一下! 789和'abc'如何分配列别名column3
?这是含糊不清的。
事实证明,这是不允许的,并会产生一个错误信息,,因为它是不明确的。子查询返回了两列,但这违反了外部查询的选择列表中的每个项必须是一列的规则。我们可以这样修复:
SELECT
123 AS colum1,
456 AS column2,
(SELECT 789) AS column3,
(SELECT 'abc') AS column4;
现在选择列表中的每个项目只返回一列。
类似的规则存在,需要在选择列表中的子查询返回不超过一个排,太:
SELECT
123 AS colum1,
456 AS column2,
(SELECT some_column FROM table_with_multiple_rows) AS column3;
这是错误的,因为子查询返回多个值,而且也没有办法的东西所有这些值转换为外部查询结果的一行。
有几种方法可以解决这个问题。确保子查询返回不超过一行。无论是使用WHERE子句指定一个行(在表的主键或唯一键的条件):
SELECT
123 AS colum1,
456 AS column2,
(SELECT some_column FROM table_with_multiple_rows
WHERE unique_column = 789) AS column3;
或者使用LIMIT 1:
SELECT
123 AS colum1,
456 AS column2,
(SELECT some_column FROM table_with_multiple_rows
LIMIT 1) AS column3;
无论哪种方式,你的子查询将返回最多只有一行(它可以匹配零行,在这种情况下,子查询的结果将为NULL)。
最有可能的,因为你有一个空的'SELECT'。 –