3

我想知道为什么像select * as t下面这样的语句会出现在 mysql 子查询中。

下面按列删除表中最旧的 3 行created_time

为什么这是正确的

DELETE FROM mytable WHERE id = ANY 
( SELECT * FROM ( SELECT id FROM mytable ORDER BY created_time ASC LIMIT 3')as t)

并不是

DELETE FROM mytable WHERE id = ANY 
(SELECT id FROM mytable ORDER BY created_time ASC LIMIT 3) 

?

对我来说,第二种形式是有意义的。它不起作用,我想了解为什么第一个是必要的。具体来说,什么是tas t做什么?

4

1 回答 1

3

在许多数据库中,from子句中的子查询需要有一个明确的别名。as是可选的。我通常as用于列,而将其用于表:

DELETE FROM mytable
    WHERE id = ANY ( SELECT * FROM ( SELECT id FROM mytable ORDER BY created_time ASC LIMIT 3') t)

为什么需要子查询是 MySQL 的变幻莫测。它不允许deleteorupdate中的表引用出现在子查询子句中。哦,它确实允许在 subquery-within-a-subquery 子句中使用它。因此,解决此限制非常容易。

于 2013-02-19T16:59:26.623 回答