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_id の double を消去します。

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

1 に答える 1

4
delete from Ticket
where exists
 (select rowid from Ticket t2
   where t2.ID = Ticket.ID and t2.rowid < Ticket.rowid)

rowid常に存在するSQLitebtreeインデックス列です。

2009年8月17日のSQLiteメーリングリストのMartinEngelschalkに感謝します。

于 2009-12-09T22:21:04.520 に答える