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

Posted

技术标签:

【中文标题】MySQL中的“每个派生表都必须有自己的别名”是啥错误?【英文标题】:What is the error "Every derived table must have its own alias" in MySQL?MySQL中的“每个派生表都必须有自己的别名”是什么错误? 【发布时间】:2010-12-25 17:13:01 【问题描述】:

我在 mysql 上运行这个查询

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

它给出了这个错误:

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

是什么导致了这个错误?

【问题讨论】:

你不能把它简化为“从 TT2 中选择 ID”吗? 我最近收到了这个错误,因为我在一个有很多 UNION ALLs 的查询中有一个额外的 ) 看看这是如何成为排名第一的 Google 搜索...接受的答案并没有真正回答错误“每个派生表都必须有自己的别名”。请在下面查看更多信息。 【参考方案1】:

每个派生表(AKA 子查询)确实必须有一个别名。 IE。括号中的每个查询都必须指定一个别名 (AS whatever),该别名可用于在外部查询的其余部分中引用它。

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

当然,在您的情况下,整个查询可以替换为:

SELECT ID FROM TT2

【讨论】:

显示示例代码的正确答案,但不是大多数查找此问题的用户的解决方案。 @ToBe 我很好奇你的意思是什么?答案在任何查询中都是正确的,如果您的 from 子句中有派生表,则需要给它一个别名。 抱歉,我没有看到您还修复了原始查询并添加了AS 语句。我以为你只显示了速记。删除了我的反对票。 我和@ToBe 的想法一样。答案是这样的:“这里,派生表的意思是'在FROM子句中使用的子查询'。在提问者的情况下;它们是括号内的子查询。如果您不使用关键字'as'指示别名对于这些查询,dbms 查询引擎无法确定哪个查询没有它们的名称(或别名),因此,您必须为所有子查询提供唯一的名称(别名),以使 dbms 查询引擎使其正常工作。" 最好澄清子查询不一定是派生表:它必须直接位于 FROM 子句中。 SELECT...FROM...WHERE x NOT IN (subquery) AS T 之类的语句会触发错误【参考方案2】:

我认为它要求你这样做:

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

但是你为什么要写这个查询呢?

【讨论】:

实际的查询太长了..我已经把它缩短了,这里的人们理解它的时间更少。短查询和长查询的错误是一样的。 我现在明白了。我还认为它可能是由某些代码生成的。它仍然应该像 Paul 和 DMKing 建议的那样简化。 哇,这真的是不被接受的第二个答案吗?对于任何有问题的人来说,这就是答案,MySQL 要求您标记“子查询”,而不是像许多其他实现一样只留下它。【参考方案3】:

这是一个不同的例子,没有别名就不能重写(不能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) 对子查询有什么影响? 你拯救了我的一天。它对我有用。谢谢。【参考方案4】:

我来到这里是因为我认为如果有足够的答案、在给我这个错误的语法错误之后,或者如果我可以自己发布答案,我应该检查 SO。

好的,这里的答案解释了这个错误是什么,所以不多说了,但我还是会用我自己的话给我的 2 美分:

此错误是由于您基本上使用FROM 命令的子查询生成了一个新表。

这就是derived table 的含义,因此,它需要有一个alias(实际上是对其的名称引用)。

给定以下假设查询:

SELECT id, key1
FROM (
    SELECT t1.ID id, t2.key1 key1, t2.key2 key2, t2.key3 key3
    FROM table1 t1 
    LEFT JOIN table2 t2 ON t1.id = t2.id
    WHERE t2.key3 = 'some-value'
) AS tt

最后,FROM 命令中的整个子查询将生成别名为tt 的表,它将具有以下列idkey1key2key3

然后,使用初始 SELECT,我们最终从生成的表 (tt) 中选择 idkey1

【讨论】:

以上是关于MySQL中的“每个派生表都必须有自己的别名”是啥错误?的主要内容,如果未能解决你的问题,请参考以下文章

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

MySql + 实体框架 = 每个派生表都必须有自己的别名

MySQL UNION - 每个派生表都必须有自己的别名

错误代码:1248。每个派生表都必须有自己的别名 没有找到查询的解决方案

Mysql 中的 Error#1221 是啥,这个 SqlQuery 的基本问题是啥?

MySQL中的`unsigned`是啥意思以及何时使用它?