SQLite有游标吗?

3

我想知道是否能在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数据库上遇到类似的问题。
1个回答

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 邮件列表上提供的信息。


1
所以在SQLite中没有游标。 - Ice
1
正确,这里没有游标。 - Doug Currie
@DougCurrie 等等,sqlite 中没有游标?现在我真的很困惑!那这个呢:http://stackoverflow.com/questions/8177938/sqlite-cursor-never-has-fields-in-it?rq=1 另外,在 Python 中,sqlite 包有游标,我认为它们是依附于 sqlite 游标的。我猜我错了,那么在 Python 的 sqlite 模块中 cursor() 是做什么的呢? - eric
SQL游标具有许多SQLite不支持的功能(您是否阅读了我引用的SQLite网页上关于游标的内容?)。其中许多操作在http://en.wikipedia.org/wiki/Cursor_(databases)上进行描述,包括FETCH(寻找、滚动)、通过CURSOR进行UPDATE和DELETE等。Python可能支持其他数据库的游标(我不确定),并使用通常的SQLite机制通过结果集进行模拟。 - Doug Currie
@Doug 我看了那个页面,但似乎对于这个初学者来说并不是一个非常直接的回答。比如,也许我错过了,但我没有看到它直接给出“sqlite 不支持游标”的地方。但我对游标不熟悉,所以也许它通过关于在结果集中向后步进的内容间接回答了这个问题。 - eric
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接