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

MySQL中“每个派生表都必须有自己的别名”的错误是什么?,mysql,subquery,mysql-dependent-subquery,mysql-error-1248,Mysql,Subquery,Mysql Dependent Subquery,Mysql Error 1248,我正在MySQL上运行这个查询 SELECT ID FROM ( SELECT ID, msisdn FROM ( SELECT * FROM TT2 ) ); 它给出了这个错误: 每个派生表都必须有自己的别名 是什么导致了这个错误?我想它要求您这样做: SELECT ID FROM (SELECT ID, msisdn FROM (SELECT * FROM TT2) as myalias ) as a

我正在MySQL上运行这个查询

SELECT ID FROM (
    SELECT ID, msisdn
    FROM (
        SELECT * FROM TT2
    )
);
它给出了这个错误:

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


是什么导致了这个错误?

我想它要求您这样做:

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

但是为什么要首先编写这个查询呢?

每个派生表(又称子查询)都必须有一个别名。也就是说,括号中的每个查询都必须有一个别名,该别名可以在外部查询的其余部分中引用

SELECT ID FROM (
    SELECT ID, msisdn FROM (
        SELECT * FROM TT2
    ) AS T
) AS T
当然,在您的情况下,整个查询可以替换为:

SELECT ID FROM TT2

这里有一个不同的例子,没有别名就无法重写,不能按DISTINCT分组

想象一下,一个名为purchases的表记录了顾客在商店购买的物品,即,这是一个多对多表,软件需要知道哪些顾客在多个商店购买了物品:

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

请注意作为自定义别名。

我来到这里是因为我认为我应该签入,以便在出现导致此错误的语法错误后,或者如果我可以自己发布答案,是否有足够的答案

好的,这里的答案解释了这个错误是什么,所以没有更多的话要说,但是我会用我的话给出我的2美分:

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

这就是派生表的含义,因此,它需要有一个别名,实际上是对它的名称引用

因此,给出以下假设查询:

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的表,它将具有以下列id、key1、key2、key3


因此,通过从该表中初始选择,我们最终从tt中选择id和key1。

您能不能将其简化为从TT2中选择id?我最近遇到了这个错误,因为我在一个查询中有一个额外的UNION ALL。这就是1 Google搜索。。。接受的答案并没有真正回答错误“每个派生表都必须有自己的别名”。请查看下面的详细信息。实际查询太长。。我把它缩短得足够短了,这里的人理解它的时间更少了。短查询和长查询的错误是相同的。我现在明白了。我还认为它可能是由一些代码生成的。它仍然应该像保罗和德金建议的那样简化。哇,这真的是不被接受的第二个答案吗?对于任何有此问题的人来说,这就是答案,MySQL要求您标记子查询,而不是像许多其他实现一样将其保留。所示sampe代码的答案正确,但不是大多数查找此问题的用户的解决方案。@ToBe我很好奇您的意思是什么?答案在任何查询中都是正确的,即如果from子句中有派生表,则需要为其指定别名。对不起,我没有看到您也修复了原始查询并添加了AS语句。我以为你只会速记。删除了我的否决票。我对@ToBe也有同样的想法。答案是:这里,派生表的意思是“FROM子句中使用的子查询”。就提问者而言;它们是括号内的子查询。如果未使用关键字“as”为这些查询指示别名,则dbms查询引擎无法在没有名称或别名的情况下确定哪个查询是what,必须为所有子查询指定唯一的名称和别名,才能使dbms查询引擎正常工作。最好澄清子查询不一定是派生表:它必须直接位于FROM子句中。像SELECT…FROM…这样的语句,其中x不在子查询中,因为T将触发错误SUM1对子查询有什么影响?
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