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 ALL
s 的查询中有一个额外的 )
。
看看这是如何成为排名第一的 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
的表记录customers
在stores
进行的购买,即它是多对多表,并且软件需要知道哪些客户在多个商店进行了购买:
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
的表,它将具有以下列id
、key1
、key2
、key3
。
然后,使用初始 SELECT
,我们最终从生成的表 (tt
) 中选择 id
和 key1
。
【讨论】:
以上是关于MySQL中的“每个派生表都必须有自己的别名”是啥错误?的主要内容,如果未能解决你的问题,请参考以下文章
错误代码:1248。每个派生表都必须有自己的别名 没有找到查询的解决方案