MySQL中的错误“每个派生表必须具有自己的别名”是什么?


386

我在MySQL上运行此查询

SELECT ID FROM (
    SELECT ID, msisdn
    FROM (
        SELECT * FROM TT2
    )
);

它给出了这个错误:

每个派生表必须具有自己的别名。

是什么导致此错误?


14
您能否将其简化为“从TT2中选择ID”?
DMK

5
我最近收到此错误的原因)是,查询中有很多额外的UNION ALLs。
mpen 2012年

10
似乎这是排名第一的Google搜索...接受的答案并未真正回答错误“每个派生表都必须具有自己的别名”。在下面查看更多信息。
丹尼尔·查普曼

Answers:


542

每个派生表(AKA子查询)确实必须具有别名。也就是说,括号中的每个查询都必须被赋予一个别名(AS whatever),该别名可以在外部查询的其余部分中用于引用它。

SELECT ID FROM (
    SELECT ID, msisdn FROM (
        SELECT * FROM TT2
    ) AS T
) AS T

当然,对于您而言,整个查询可以替换为:

SELECT ID FROM TT2

21
对于显示的示例代码,请提供正确的答案,但对于大多数查找此问题的用户而言,请提供正确的答案。
ToBe 2014年

1
@ToBe我很好奇你的意思是什么?答案在任何查询中都是正确的,如果您的from子句中有派生表,则需要给它一个别名。
AdamMc331

2
抱歉,我没有看到您还修复了原始查询并添加了AS语句。我以为您只显示了速记。删除了我的否决票。
ToBe

我在@ToBe也有同样的想法。答案是这样的:“在这里,派生表意味着'FROM子句中使用的子查询。在发问者的情况下,它们是括号内的子查询。如果您不使用关键字'as'来表示别名,对于这些查询,dbms查询引擎无法确定哪个查询没有它们的名称(或别名),因此,您必须为所有子查询提供唯一的名称(别名),以使dbms查询引擎使其正常工作。”
Bahadir Tasdemir '16

1
最好阐明子查询不一定是派生表:它必须直接在FROM子句中。像这样的语句SELECT...FROM...WHERE x NOT IN (subquery) AS T将触发错误
Nicholas

76

我认为这是在要求您这样做:

SELECT ID
FROM (SELECT ID,
             msisdn 
      FROM (SELECT * FROM TT2) as myalias
     ) as anotheralias;

但是,为什么首先要编写此查询?


16
实际的查询时间过长。.我已将其缩短得足够短,以至于这里的人们没有更多的时间来理解它。简短查询和长期查询中的错误相同。
silverkid

我现在知道了。我还认为它可能是由某些代码生成的。正如Paul和DMKing所建议的那样,它仍然应该简化。
hometoast

9
哇,这真的是无法接受的第二个答案吗?对于任何有问题的人,这就是答案,MySQL要求您标记“子查询”,而不是像其他许多实现一样保留它。
丹尼尔·查普曼

17

这是一个不同的例子,没有别名就不能重写(不能GROUP BY DISTINCT)。

想象一下,一个叫做表purchases,通过做记录购买customersstores,也就是说,它是一个多对多表和软件需要知道哪些客户已经超过一个商店购物:

SELECT DISTINCT customer_id, SUM(1)
  FROM ( SELECT DISTINCT customer_id, store_id FROM purchases)
  GROUP BY customer_id HAVING 1 < SUM(1);

..将因错误而中断Every derived table must have its own alias。修理:

SELECT DISTINCT customer_id, SUM(1)
  FROM ( SELECT DISTINCT customer_id, store_id FROM purchases) AS custom
  GROUP BY customer_id HAVING 1 < SUM(1);

(注意AS custom别名)。


SUM(1)对子查询有什么影响?
xssChauhan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.