2013-11-27 69 views
0

我在很長一段時間裏使用了這個stackoverflow技巧,並且在相當長的一段時間內工作正常。 Generate an Update SQL for Changing the Order of an Item?更改行的順序不工作?

但是,如果有一個記錄缺少行之間,它將無法正常工作。看到這個示例,

declare @MyTable table 
(
    [ID] INT, 
    [Order] INT, 
    Name VARCHAR(20) 
) 
insert into @MyTable values(11111,1,'A'), (22222,2,'B'), (3333,3,'C'),(44444,4,'D'); 
select * from @MyTable; 
--which will gives you 
    ---------------------- 
-- ID Order  Name 
-- 11111 1  A 
-- 22222 2  B 
-- 3333 3  C 
-- 44444 4  D 
    ---------------------- 

-- Now just delete a row 
delete from @MyTable where [ID] = 3333; 
select * from @MyTable; 
--which will gives you 
    -------------------- 
-- ID Order  Name 
-- 11111 1 A 
-- 22222 2 B 
-- 44444 4 D 
    -------------------- 
-- Now just decrement the order of 4 
declare @OldOrder INT = 4; 
declare @NewOrder INT = @OldOrder - 1; 

UPDATE @MyTable 
SET [Order] = (CASE 
       WHEN 
        [Order] = @OldOrder 
       THEN 
        @NewOrder 
       WHEN 
        @NewOrder > @OldOrder 
       THEN 
        [Order] - 1 
       ELSE 
        [Order] + 1 
      END) 
WHERE ([Order] BETWEEN @OldOrder AND @NewOrder OR [Order] BETWEEN @NewOrder AND @OldOrder) 

select * from @MyTable; 
--which will gives you 
-------------------- 
--ID Order Name 
--11111 1 A 
--22222 2 B 
--44444 3 D 
-------------------- 

--The result should be 
-------------------- 
--ID Order Name 
--11111 1 A 
--22222 3 B 
--44444 2 D 
-------------------- 
+0

將「44444」作爲「2號訂單」和「22222」訂在「3號訂單」上的標準是什麼? – Edper

+0

如果你解釋邏輯是什麼,那麼我將用解決方案更新我的答案......目前,我只能指出這個問題。 – christiandev

+0

@christiandev,只是一個簡單的表格,我在這裏指定1,2,3的順序,等等。現在用戶可以隨時重新排序和刪除任何行。 – user960567

回答

1

你更新了幾個問題...

UPDATE @MyTable 
SET [Order] = (CASE 
       WHEN [Order] = @OldOrder THEN  @NewOrder 
       WHEN @NewOrder > @OldOrder THEN [Order] - 1 
       ELSE 
        [Order] + 1 
      END) 
WHERE ([Order] BETWEEN @OldOrder AND @NewOrder OR [Order] BETWEEN @NewOrder AND @OldOrder) 
  1. WHEN 3 > 4 THEN [Order] - 1
  2. WHERE ([Order] BETWEEN 4 AND 3 OR [Order] BETWEEN 3 AND 4)

你只更新一個記錄在此查詢,所以輸出是正確的。

0

您的第二個WHEN條件從不計算爲true。 您指定@NewOrder = @OldOrder - 1,因此@NewOrder永遠不會大於@OldOrder