Вот
я есть такая таблица:
groupId guid PK
parentId guid
name
left int
right int
Существует внешний ключ от parentId к groupId (это таблица с самоссылкой).
левый и правыйMPTT левый / правый значения для поддержания иерархии. Здесь важно отметить, что чем больше левое значение, тем глубже вложенный элемент (другими словами: для любого данного элемента его левое значение всегда будет больше, чем левое значение всех родителей).
Я пытаюсь написать быстрый оператор DELETE, чтобы удалить все, кроме самой верхней группы (которая всегда имеет пустое значение GUID), например:
DELETE FROM [group] WHERE [groupId] <> '00000000-0000-0000-0000-000000000000'`
К сожалению, это не работает, так как обычно под каждой группой есть подгруппы, которые предотвращают удаление. Если вы выполняете этот запрос DELETE снова и снова, в конечном итоге он удалит все, но это, очевидно, не очень хорошее решение.
Что я хочу, это эквивалент:
DELETE FROM [group] WHERE [groupId] <> '00000000-0000-0000-0000-000000000000'
ORDER BY [left] DESC
Конечно, это недопустимый синтаксис, но, по сути, сначала следует удалить элементы с самыми большими левыми значениями, чтобы убедиться, что ниже нет групп, которые будут препятствовать удалению из-за ограничений FK.
Я также попробовал:
delete from [group] where groupid in (
select top 1000000 * from [group]
where groupid <> '00000000-0000-0000-0000-000000000000'
ORDER BY [left] desc
)
который является допустимым синтаксисом (вы можете использовать ORDER BY, только если вы также используете TOP), но на самом деле не вызывает DELETE в порядке возвращаемых строк, поэтому он по-прежнему не работает.
Можно ли это сделать, не прибегая к курсору для удаления строк по одной?