【问题标题】:Mysql Subquery SyntaxMysql 子查询语法
【发布时间】:2013-02-19 16:55:14
【问题描述】:

我想知道为什么像 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 是做什么的?

【问题讨论】:

  • 这是愚蠢的 MySQL 限制之一。第二条语句适用于所有其他 DBMS 就好了。即使第一个被接受,我也记得它的一些问题。您只是不能在 MySQL 的子选择中使用要从中删除的表,您需要使用连接
  • @a_horse_with_no_name:此解决方法的示例未按预期工作:Problem with MySQL subquery
  • @ypercube:谢谢,这正是我的想法;)
  • 心理图像:你进入迷宫并在路上 - 不像忒修斯 - 你砍断了线。不要指望安全出来。

标签: mysql sql syntax subquery


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2010-10-06
    • 2017-10-22
    • 1970-01-01
    相关资源
    最近更新 更多