457

我在 MySQL 上运行这个查询

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

它给出了这个错误:

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

是什么导致了这个错误?

4

4 回答 4

622

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

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

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

SELECT ID FROM TT2
于 2009-12-11T15:31:39.800 回答
85

我认为它要求你这样做:

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

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

于 2009-12-11T15:28:14.387 回答
20

这是一个不同的示例,如果没有别名( can't GROUP BY DISTINCT)就无法重写。

想象一个名为的表purchases,记录了customersat的购买情况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别名)。

于 2013-07-05T23:47:34.340 回答
7

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

好的,这里的答案解释了这个错误是什么,所以不多说了,但是我还是会用我自己的话给我的 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

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

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

于 2020-09-16T09:39:56.337 回答