2017-04-06 110 views

回答

0

最终选择没有指定任何列。试试这个:

SELECT * from (SELECT Tag, COUNT(*) AS magnitude 
FROM (SELECT * 
FROM sport b 
join sport a 
on a.Tag = b.Name 
where b.sport_ID > a.sport_ID and a.Tag = 'Football') as ball 
group by Tag 
LIMIT 1) as ball2 

即使b.sport_ID> b.sport_ID没有意义。

+0

仍然出现似乎错误 – Beck

+0

更新了查询。当你有分组功能时,你也错过了group by子句。你是否得到相同的错误或不同? –

+0

我现在正在收到此消息#1248 - 每个派生表都必须具有自己的别名 – Beck

1

您的子查询有两列:标签和大小。这不是一个标量子查询。

错误的解释是选择列表中的每个子查询都必须是标量子查询,这意味着它必须只返回一列和一行。

示例:让我们保持简单并使用字面值查询,因此我们甚至不引用表。我们为选择列表中的每个项目分配一个列别名。

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)。

+0

我现在很困惑 – Beck

+0

@Beck:看看我上面的例子。 –

+0

现在我被告知sport_ID是重复的列名称 – Beck

相关问题