2009-12-09 51 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