Informix中如何通过rowid和first限制DELETE语句的删除行数
报错原因
你使用的数据库(语法特征判断为Informix)存在原生语法限制,不允许在IN子句的内层子查询中直接使用FIRST/LIMIT/SKIP类的行限制关键字,因此触发944错误。
可行解决方案
以下三种方案都可以绕过该限制,可根据你的数据库版本选择:
方案1:临时表中转(兼容所有版本,最稳妥)
先把待删除的rowid存入临时表,再基于临时表执行删除:-- 生成存储待删rowid的临时表 SELECT FIRST 1000 rowid AS del_rowid INTO TEMP tmp_del_rows FROM table1 WHERE last_update < today-30; -- 执行删除 DELETE FROM table1 WHERE rowid IN (SELECT del_rowid FROM tmp_del_rows);临时表会在当前会话结束后自动清理,无需手动删除。
方案2:子查询套层绕过解析限制(兼容大部分中高版本)
给带FIRST的子查询额外加一层派生表封装,让数据库解析器将其识别为普通结果集,即可正常用在IN子句中:DELETE FROM table1 WHERE rowid IN ( SELECT del_rowid FROM ( SELECT FIRST 1000 rowid AS del_rowid FROM table1 WHERE last_update < today-30 ) AS t );方案3:DELETE直接加行限制(11.70及以上版本可用,写法最简洁)
高版本Informix支持直接在DELETE语句中加FIRST关键字控制删除行数,不需要写子查询:DELETE FIRST 1000 FROM table1 WHERE last_update < today-30;
内容的提问来源于stack exchange,提问作者Kate T
相关产品推荐
相关产品推荐

