CTE в вашем комментарии близок, но вы не сохраняете опорную точку.Чтобы ответить на ваш вопрос о курсорах, НЕТ, НИКОГДА!Каждый раз, когда вы думаете об использовании курсора, вы почти наверняка ошибаетесь.(да, есть случаи, но они действительно предназначены для специальных целей, а не для простых обновлений баз).
Я до сих пор не понимаю, какие данные и что вы хотите сделать, но эта версия CTE найдетвсе строки, которые не имеют родителя (parent равен null), а затем все его дочерние элементы.Это также сохранит идентификатор верхнего уровня в качестве якоря, чтобы вы могли использовать его для свертывания других.
Я уверен, что это не на 100% от того, что вам нужно, но это должно дать хороший результат.Идея, которую вы можете использовать.
Затем вы можете сохранить это во временную таблицу и использовать ее в качестве основы для всего, что вам нужно сделать - установить родительский элемент для любых строк на родительский уровень верхнего уровня, установить min createdateили максимальное изменение даты, или полностью удалить строки.
Делайте все на основе набора, а не пытайтесь перебрать что-либо с помощью курсора.
Это будет ваш CTE с привязкой (сохраненный topID):
with cte as (
-- Find all the rows that are top level
select id as TopID, type, id, null as parent, title,
datetime(dateAdded/1000000,'unixepoch') as dateAdded,
datetime(lastModified/1000000,'unixepoch') as lastModified
from moz_bookmarks
where parent is null
union all
select cte.TopID, b.type, b.id, b.parent, b.title,
datetime(b.dateAdded/1000000,'unixepoch') as dateAdded,
datetime(b.lastModified/1000000,'unixepoch') as lastModified
from moz_bookmarks b
join cte sub on sub.id = b.parent
)
select * from cte;