tags:

views:

195

answers:

1

Hi there,

i wonder if i could run the following procedure in 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

This is a little procedure from a ms-sql2000 which cleans doubles of Ticket_id's in a given table Ticket of the following 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))

Due to a simple merger from different databases, the ticket_id's becomes not unique. To fix by renumbering this i developed this procedure but now we have a similar issue on a SQLite-db.

+1  A: 
delete from Ticket
where exists
 (select rowid from Ticket t2
   where t2.ID = Ticket.ID and t2.rowid < Ticket.rowid)

rowid is the always-present SQLite btree index column.

Thanks to Martin Engelschalk on the SQLite mailing list on 2009-08-17.

Doug Currie
Seems not to renumber the duplicate tickets. deletion is not the solution. Have also to document the old id and the new id in a list...
Ice
OK, now that I know what you are trying to do, perhaps a 4 step process: insert the dups to a temp table using the where clause above, delete the dups as above, renumber the dups in the temp table, and insert them back.
Doug Currie
So there are no cursors in sqlite.
Ice
Correct, there are no cursors. http://www.sqlite.org/cvstrac/wiki?p=ScrollingCursor
Doug Currie