我想知道我是否可以在 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 中的 Ticket_id 的两倍:
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 上遇到了类似的问题。
最佳答案
delete from Ticket
where exists
(select rowid from Ticket t2
where t2.ID = Ticket.ID and t2.rowid < Ticket.rowid)
rowid
是始终存在的 SQLite btree 索引列。
感谢 2009 年 8 月 17 日 SQLite 邮件列表中的 Martin Engelschalk。
关于sqlite - SQLite 有游标吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1876988/