2015-04-16 95 views

回答

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是這個名字的原始程序(或者,至少比微軟的同名最近更新的原始程序,無論如何),我寫了超過25年的時間,並且可以從IIUG — International Informix Users Group下載它的來源。

+0

其實累了你上面提到的查詢。它沒有工作。對於在上述問題中提到的錯誤查詢,我抱歉。 – v0001

+0

「沒有工作」是如此令人生厭的描述;目前尚不清楚發生了什麼事。答案是,你可能得到錯誤-944:在這種情況下,不能使用「第一」,「限制」或「跳過」。這是資料豐富(也令人惱火,但也提供信息)。當然,在這個查詢中總會有一個「FIRST 100意味着什麼」的問題。您使用的是哪個版本的Informix?如果它是12.10,則可以使用OLAP功能,並且應該能夠使用該功能來完成這項工作 - 但我尚未將我的大腦包括在符號中。 –

0

您的查詢看起來沒問題。如果select FIRST 100 id from tableName返回一些東西,那麼這樣的DELETE應該刪除這些行。檢查這樣的SELECT返回。

也許你在交易中使用它,然後你不提交這些更改。

如果您從智能SQL編輯器中調用DELETE,它應該會顯示類似的行100行已更改。這些信息(受影響的行數)由Java JDBC或其他環境中的類似函數返回executeUpdate()

相關問題