在我前面的一个问题中,我要求解决这个问题
mysql 1235错误:
错误代码:1235。这个版本的mysql还不支持limit&in/all/any/some子查询
下面将抛出1235:
DELETE
FROM job_detail_history
where id not in (select id from job_detail_history order by start_time desc limit 2);
为此,我得到了@zaynul abadin tuhin给出的解决方案,如下所示,它也适用于我。他只是在我的子查询上添加了一个select层。据他说,这是一些mysqlMaven建议的。
上述问题的解决方法:
DELETE
FROM job_detail_history
where id not in (select * from
(select id from job_detail_history order by start_time desc limit 2) as t1 );
我试着对db表进行分析,发现当我使用
问题:如上所述,这不适用于delete。
select id from job_detail_history order by start_time desc limit 2;
它给我的回报是这样的:
最后 null
是工作台建议的新行:
当我再加上一层select时:
添加额外的子查询层:这将与我的delete一起工作。
(select id from (select id from job_detail_history order by start_time desc limit 2) as t1);
它返回如下内容:
我想了解的是
如何用一个额外的子查询层解决1235错误?
有人能详细说明一下吗。
1条答案
按热度按时间62lalag41#
子查询和派生表之间有一个重要的区别。
派生表替换表(也可以使用“普通”表名时使用),特别是在
from <tablename>
或者join <tablename>
,它需要一个别名(或“tablename”,因为它被用作任何其他表)。你不会写字where not in (<tablename>)
; 这不是派生表,而是子查询。通常,删除时会出现此问题(以及使用另一层的解决方案):
不能从表中删除,也不能从子查询中的同一表中选择。
但不禁止使用此表的派生表。mysql根本无法处理(或者不想处理)这种依赖关系,比如它如何在内部工作(以及根据它的规则)。
为了
LIMIT
,存在类似的子查询特定限制,mysql不支持对某些子查询运算符进行子查询限制
错误1235(42000):此版本的mysql尚不支持“limit&in/all/any/some子查询”
至于它对mysql产生影响的原因:派生表是独立的,不能依赖于外部查询。它可以像普通表一样在内部使用(e、 例如,mysql只需在执行计划的第一步创建这个表,就可以执行所有后续步骤。)另一方面,子查询可以依赖于外部表(使其成为依赖子查询)。
明确地,
与相同
而你却不能这样做
limit
:不等于
mysql根本无法处理这个问题,因为它习惯于进行这种转换。但它迟早会允许的。要使其用于删除,仍然需要使用子查询。