2009-12-09 52 views
3

我想如果我能在SQLite的運行下面的過程:SQLite有遊標嗎?

set nocount on 

select T.ID, max(T.SerialNo) as SerialNo 
into #Tmp_Ticket_ID 
from Ticket as T, Ticket as inserted 
where t.ID = inserted.ID 
group by T.id having count(*) > 1 

declare zeiger cursor for 
    select SerialNo 
    from #Tmp_Ticket_ID 

declare @SerialNo int 

OPEN Zeiger 
FETCH NEXT FROM zeiger INTO @SerialNo 
WHILE (@@fetch_status <> -1) 
BEGIN 
    IF (@@fetch_status <> -2) 
    BEGIN 
     update T 
      set ID = (select max(id) + 1 from Ticket) 
     from ticket AS T, #Tmp_Ticket_ID as I 
     where t.serialNo = i.serialno 
     and I.Serialno = @SerialNo 
    END 
    FETCH NEXT FROM zeiger INTO @SerialNo 
END 
CLOSE Zeiger 
DEALLOCATE Zeiger 
DROP TABLE #Tmp_Ticket_ID 

這是一個MS-SQL2000其清潔TICKET_ID的雙打在以下structur的給定表票務一個小程序:

create table Ticket (serialNo int identity(1,1) not null 
    , ID as int not null 
    , Ticket_issue as varchar(50) 
    , some_more_field varchar(500)) 

由於來自不同數據庫的簡單合併,ticket_id變得不唯一。要重新編號來解決這個問題,我開發了這個程序,但是現在我們在SQLite-db上有類似的問題。

回答

4
delete from Ticket 
where exists 
(select rowid from Ticket t2 
    where t2.ID = Ticket.ID and t2.rowid < Ticket.rowid) 

rowid是始終存在的SQLite btree索引列。

感謝Martin Engelschalk在2009-08-17 SQLite郵件列表上。

+0

似乎不重新編號的重複票。刪除不是解決方案。還需要在列表中記錄舊的ID和新的ID ... – Ice 2009-12-09 22:54:29

+0

好的,現在我知道你在做什麼,也許是一個4步的過程:使用上面的where子句將dups插入臨時表,如上所述刪除dups,將臨時表中的dups重新編號並將其插回。 – 2009-12-09 23:02:44

+1

因此,在sqlite中沒有遊標。 – Ice 2009-12-10 18:56:48