Есть ли в SQLite курсоры?

интересно, смогу ли я запустить следующую процедуру в 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 в заданной таблице Ticket следующей структуры:

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.


person Ice    schedule 09.12.2009    source источник


Ответы (1)


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

rowid — это всегда присутствующий столбец индекса btree SQLite.

Спасибо Мартину Энгельшалку из списка рассылки SQLite от 17 августа 2009 г.

person Doug Currie    schedule 09.12.2009
comment
Кажется, не перенумеровать дубликаты билетов. удаление не является решением. Также необходимо задокументировать старый идентификатор и новый идентификатор в списке... - person Ice; 10.12.2009
comment
Хорошо, теперь, когда я знаю, что вы пытаетесь сделать, возможно, процесс из 4 шагов: вставьте дубликаты во временную таблицу, используя указанное выше предложение where, удалите дубликаты, как указано выше, перенумеруйте дубликаты во временной таблице и вставьте их обратно. . - person Doug Currie; 10.12.2009
comment
Так что в sqlite нет курсоров. - person Ice; 10.12.2009
comment
Правильно, курсоров нет. sqlite.org/cvstrac/wiki?p=ScrollingCursor - person Doug Currie; 10.12.2009
comment
@DougCurrie подождите, в sqlite нет курсоров? Теперь я действительно смущен! Как насчет: stackoverflow.com/questions/8177938/ Кроме того, в python пакет sqlite имеет курсоры, я предположил, что они привязаны к курсорам sqlite. Думаю, я был неправ, и в таком случае, что делает cursor() в модуле sqlite в python? - person eric; 07.11.2014
comment
Курсоры SQL имеют много функций, которые не поддерживаются SQLite (вы читали веб-страницу SQLite о курсорах, на которые я ссылался?). Многие из этих операций описаны на странице en.wikipedia.org/wiki/Cursor_(базы данных) и включать FETCH (поиск, прокрутка), UPDATE и DELETE через CURSOR и т. д. Python может поддерживать курсоры для других баз данных (я не знаю) и подделывать их для SQLite, используя обычный SQLite-механизм пошагового прохождения результата набор. - person Doug Currie; 07.11.2014
comment
@Doug Я просмотрел эту страницу, но она не показалась очень прямым ответом на общий вопрос, по крайней мере, этому нубу. Например, может быть, я пропустил это, но я не видел, где это напрямую вышло с курсорами, которые невозможны в sqlite. Но я не знаком с курсорами, так что, возможно, он косвенно ответил на это, что-то вроде возврата в результирующем наборе или что-то в этом роде. - person eric; 15.11.2014