为什么要多加一层select解析mysql错误代码:1235

eiee3dmh  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(391)

在我前面的一个问题中,我要求解决这个问题
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错误?
有人能详细说明一下吗。

62lalag4

62lalag41#

子查询和派生表之间有一个重要的区别。
派生表替换表(也可以使用“普通”表名时使用),特别是在 from <tablename> 或者 join <tablename> ,它需要一个别名(或“tablename”,因为它被用作任何其他表)。你不会写字 where not in (<tablename>) ; 这不是派生表,而是子查询。
通常,删除时会出现此问题(以及使用另一层的解决方案):
不能从表中删除,也不能从子查询中的同一表中选择。
但不禁止使用此表的派生表。mysql根本无法处理(或者不想处理)这种依赖关系,比如它如何在内部工作(以及根据它的规则)。
为了 LIMIT ,存在类似的子查询特定限制,
mysql不支持对某些子查询运算符进行子查询限制
错误1235(42000):此版本的mysql尚不支持“limit&in/all/any/some子查询”
至于它对mysql产生影响的原因:派生表是独立的,不能依赖于外部查询。它可以像普通表一样在内部使用(e、 例如,mysql只需在执行计划的第一步创建这个表,就可以执行所有后续步骤。)另一方面,子查询可以依赖于外部表(使其成为依赖子查询)。
明确地,

where id not in (select id from job_detail_history);

与相同

where not exists (select id from job_detail_history sub where sub.id = outer.id);

而你却不能这样做 limit :

where id not in (select id from job_detail_history limit 2);

不等于

where not exists (select id from job_detail_history sub 
                   where sub.id = outer.id limit 2);

mysql根本无法处理这个问题,因为它习惯于进行这种转换。但它迟早会允许的。要使其用于删除,仍然需要使用子查询。

相关问题