我想知道为什么像select * as t
这样的语句出现在mysql子查询中,如下所示。
以下内容根据created_time
列删除表格中最旧的3行。
为什么这是正确的
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)
对我来说,第二种形式是有道理的。它不起作用,我想了解为什么第一个是必要的。具体来说,t
是什么以及as t
做什么?
答案 0 :(得分: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。它不允许delete
或update
中的表引用出现在子查询子句中。哦,它确实允许它在subquery-a-subquery子句中。因此,解决此限制很容易。