用于删除IBM Informix中表的前100行的数据库查询

时间:2015-04-16 18:29:13

标签: database informix

我尝试使用以下查询,但它无效。

delete from tableName where id IN (select FIRST 100 id from tableName)

提前致谢。

2 个答案:

答案 0 :(得分:2)

子查询不返回列。您需要使用:

DELETE FROM tableName
 WHERE id IN (SELECT FIRST 100 id FROM tableName)

上面的查询生成错误-944(不能使用"第一个","限制"或"跳过"在此上下文中 - 一个恼人的限制),所以我们必须在服务器周围工作:

$ sqlcmd -d stores -e 'create table tablename (id integer not null primary key)'
$ random -n 350 | sort -u | sqlreload -d stores -t tablename
348 rows committed
$ sqlcmd -e 'select count(*) from tablename'
348
$ sqlcmd -d stores \
>        -e 'select first 100 id from tablename into temp delete_me' \
>        -e 'delete from tablename where id in (select * from delete_me)'
$ sqlcmd -e 'select count(*) from tablename'
248
$

在示例中,我不需要删除临时表delete_me,但是在程序中,一旦完成就明确地这样做可能是个好主意。选择一个不太可猜测的名称可能会更好 - 一个基于UUID或GUID的名称或类似的名称。

请注意,' FIRST 100'是一个不确定的数字列表;它可能几乎是表格中的任意100行。

这个sqlcmd是该名称的原始程序(或者,至少比微软的johnny更具原创性 - 无论如何都是同名的),我写的是超过25年的时间,其来源可以从IIUG — International Informix Users Group下载。

答案 1 :(得分:0)

您的查询看起来不错。如果select FIRST 100 id from tableName返回某些内容,则此类DELETE应删除这些行。检查SELECT返回的内容。

也许您在事务中使用它,然后您不提交这些更改。

如果从智能SQL编辑器调用此类DELETE,它应该显示 100行已更改。此类信息(受影响的行数)由{JDBC(1)}从Java JDBC或其他环境中的类似函数返回。