Вот

я есть такая таблица:

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 в порядке возвращаемых строк, поэтому он по-прежнему не работает.

Можно ли это сделать, не прибегая к курсору для удаления строк по одной?

Ответы на вопрос(4)

Ваш ответ на вопрос