代码之家  ›  专栏  ›  技术社区  ›  Ice

SQLite有游标吗?

  •  3
  • Ice  · 技术社区  · 16 年前

    我想知道是否可以在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中的一个小程序,它清除给定表票证中的两倍票证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))
    

    1 回复  |  直到 16 年前
        1
  •  4
  •   Doug Currie    16 年前
    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 Engelscalk。

    推荐文章