Таблица переиндексации; обновить с от - PullRequest
1 голос
/ 23 марта 2010

Запрос говорит сам за себя, я не могу найти правильный синтаксис без использования цикла WHILE

UPDATE Webtree SET Webtree.Sorting=w2.Sorting
 FROM
 (
  SELECT
    BranchID,
    CASE
     WHEN @Index>=ROW_NUMBER() OVER(ORDER BY Sorting ASC) THEN ROW_NUMBER() OVER(ORDER BY Sorting ASC)
     ELSE ROW_NUMBER() OVER(ORDER BY Sorting ASC)+1
    END AS Sorting
   FROM Webtree w2
   WHERE w2.ParentID=@ParentID
 )
 WHERE Webtree.BranchID=w2.BranchID

1 Ответ

0 голосов
/ 23 марта 2010

Не уверен, на какой версии SQL Server вы работаете - если вы используете SQL Server 2005 или более позднюю версию, вы можете попробовать использовать CTE (Common Table Expression):

; WITH BaseData AS
(
   SELECT
      BranchID,
      CASE
         WHEN @Index >= ROW_NUMBER() OVER(ORDER BY Sorting ASC) THEN ROW_NUMBER() OVER(ORDER BY Sorting ASC)
         ELSE ROW_NUMBER() OVER(ORDER BY Sorting ASC)+1
       END AS Sorting
   FROM Webtree
   WHERE ParentID = @ParentID
)
UPDATE Webtree 
SET Webtree.Sorting = base.Sorting
FROM BaseData base
WHERE Webtree.BranchID = base.BranchID

Не уверен, откуда взялись эти значения @Index и @ParentID - конечно, они должны быть доступны для CTE!

CTE создает нечто вроде «встроенного временного представления», которое доступно только следующему оператору после него. Таким образом, вы часто можете «распутать» два смешанных утверждения и прояснить свое намерение и свои шаги (кому-то еще, читающему код, или себе, если вам придется вернуться и изменить это через 6 месяцев) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...