什么是错误"每个派生表必须在MySQL中拥有自己的别名"?

sil*_*kid 359 mysql subquery mysql-error-1248 mysql-dependent-subquery

我在MySQL上运行此查询

SELECT ID FROM (
    SELECT ID, msisdn
    FROM (
        SELECT * FROM TT2
    )
);
Run Code Online (Sandbox Code Playgroud)

并且它给出了这个错误:

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

是什么导致了这个错误?

Pau*_*aul 506

每个派生表(AKA子查询)必须确实具有别名.即括号中的每个查询都必须给出一个别名(AS whatever),可以用来在外部查询的其余部分中引用它.

SELECT ID FROM (
    SELECT ID, msisdn FROM (
        SELECT * FROM TT2
    ) AS T
) AS T
Run Code Online (Sandbox Code Playgroud)

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

SELECT ID FROM TT2
Run Code Online (Sandbox Code Playgroud)

  • 对于显示的示例代码的正确答案,但不是大多数用户查找此问题的解决方案. (19认同)
  • @ToBe 我很好奇你这是什么意思?答案在任何查询中都成立,如果您的 from 子句中有派生表,则需要为其指定一个别名。 (3认同)
  • 对不起,我没有看到你也修复了原始查询并添加了"AS"语句.我以为你只是表现出速记.删除了我的downvote. (2认同)
  • 最好澄清子查询不一定是派生表:它必须直接在 FROM 子句中。像 `SELECT...FROM...WHERE x NOT IN (subquery) AS T` 这样的语句会触发错误 (2认同)

hom*_*ast 74

我想这要求你这样做:

SELECT ID
FROM (SELECT ID,
             msisdn 
      FROM (SELECT * FROM TT2) as myalias
     ) as anotheralias;
Run Code Online (Sandbox Code Playgroud)

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

  • 实际的查询太长了..我已经缩短了它,这里的人们没有多少时间理解它.短期和长期查询的错误是相同的. (15认同)
  • 哇,这真的是不可接受的第二个答案吗?对于任何有问题的人来说,这就是答案,MySQL要求你标记"子查询",而不是像许多其他实现一样留下它. (9认同)

小智 13

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

想象一下一张名为at的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);
Run Code Online (Sandbox Code Playgroud)

..将打破错误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);
Run Code Online (Sandbox Code Playgroud)

(注意AS custom别名).


Sbp*_*pro 12

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

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

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

这就是 a 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
Run Code Online (Sandbox Code Playgroud)

最后,命令内的整个子查询FROM将生成别名为的表tt,并且它将具有以下列id, key1, key2, key3

然后,对于初始的,我们最终从生成的表 ( ) 中SELECT选择id和。key1tt