我尝试使用以下查询,但它无效。
delete from tableName where id IN (select FIRST 100 id from tableName)
提前致谢。
答案 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或其他环境中的类似函数返回。