2012-11-06 83 views
1

我在表中有一列「SortIndex」,我想添加一個「案例更新」,通過傳入ID和所選擇的新位置來重新排序該表。按列重新排列列表

SQL Fiddle

DECLARE @T TABLE 
(
    ID int, 
    Name char(1), 
    SortIndex int 
) 

INSERT @T 
SELECT 21, 'A', 1 UNION ALL 
SELECT 23, 'B', 2 UNION ALL 
SELECT 35, 'C', 3 UNION ALL 
SELECT 45, 'D', 4 UNION ALL 
SELECT 55, 'E', 5 

SELECT * FROM @T  

DECLARE @SortIndex int 

/* MOVE A -> 4 */ 

SET @SortIndex = (SELECT SortIndex FROM @T WHERE ID = 23) 

/* 
UPDATE @T 
    SET 
     SortIndex = CASE ... ?? 
*/  

/* MOVE D -> 2 */ 

SELECT * FROM @T 

這可能只用case語句來重建sortindex'es來解決這個問題?

UPDATE

期望的結果

A -> 4 

    Name SortIndex 
    B  1 
    C  2 
    D  3 
    A  4 
    E  5 

    D -> 2 

    A  1 
    D  2 
    B  3 
    C  4 
    E  5 
+0

,你能否告訴預期的結果? – Kaf

回答

2

使用下面的代碼移動和重建索引,它需要的元素後加元和(基於評論澄清答案)進入他人:

這是更苗條的版本:

移動到位置
DECLARE @SortIndex int,@MoveTo int, @CurrentSortIndex int 

SET @CurrentSortIndex = (SELECT SortIndex FROM @T WHERE ID = 45) --D 
SET @MoveTo = 2 

UPDATE--D 
    @T 
SET 
    SortIndex = @MoveTo 
WHERE 
    ID = 45 

UPDATE 
    @T 
SET 
    SortIndex = SortIndex - ((@[email protected])/(ABS(@[email protected]))) 
WHERE 
(
    SortIndex BETWEEN @CurrentSortIndex AND @MoveTo 
OR 
    SortIndex BETWEEN @MoveTo AND @CurrentSortIndex 
) 
AND 
    ID != 45 

完整的示例,也sqlfidle鏈接http://sqlfiddle.com/#!3/d41d8/5918

DECLARE @T TABLE 
(
    ID int, 
    Name char(1), 
    SortIndex int 
) 

INSERT @T 
SELECT 21, 'A', 1 UNION ALL 
SELECT 23, 'B', 2 UNION ALL 
SELECT 35, 'C', 3 UNION ALL 
SELECT 45, 'D', 4 UNION ALL 
SELECT 55, 'E', 5 


DECLARE @SortIndex int,@MoveTo int, @CurrentSortIndex int 
DECLARE @IDToMove INT 
SET @IDToMove = 21--A 

SET @CurrentSortIndex = (SELECT SortIndex FROM @T WHERE ID = @IDToMove) 
SET @MoveTo = 2 

UPDATE 
    @T 
SET 
    SortIndex = @MoveTo 
WHERE 
    ID = @IDToMove 

UPDATE 
    @T 
SET 
    SortIndex = SortIndex - ((@[email protected])/(ABS(@[email protected]))) 
WHERE 
(
    SortIndex BETWEEN @CurrentSortIndex AND @MoveTo 
OR 
    SortIndex BETWEEN @MoveTo AND @CurrentSortIndex 
) 
AND 
    ID != @IDToMove 

SELECT * FROM @T ORDER BY SortIndex 

初始版本:

DECLARE @SortIndex int,@MoveTo int, @CurrentSortIndex int 

SET @CurrentSortIndex = (SELECT SortIndex FROM @T WHERE ID = 21) --A 
SET @MoveTo = 2 

UPDATE--A 
    @T 
SET 
    SortIndex = @MoveTo 
WHERE 
    ID = 21 

IF @MoveTo > @CurrentSortIndex 

UPDATE 
    @T 
SET 
    SortIndex = SortIndex - 1 
WHERE 
    SortIndex BETWEEN @CurrentSortIndex AND @MoveTo 
AND 
    ID != 21 

IF @MoveTo < @CurrentSortIndex 

UPDATE 
    @T 
SET 
    SortIndex = SortIndex + 1 
WHERE 
    SortIndex BETWEEN @MoveTo AND @CurrentSortIndex 
AND 
    ID != 21 
+0

無法將A移動到2 –

+0

其非常接近,不知道缺少什麼,A和B因爲某種原因而爲1 –

+0

我已經在答案中添加了將A移動到2的示例。 http://sqlfiddle.com/#!3/d41d8/5918 – Farfarak

0
UPDATE @T 
SET SortIndex = CASE Name 
     when 'A' then 4 
     when 'D' then 2 
     else Name 
    end 
+0

只能切換位置:)我需要移動一個,並以某種方式「推送」其他人+1 +1 –

+0

@LasseEdsvik - 請更新您的問題,更新後您希望數據看起來像什麼樣的表單。 –

+1

@LasseEdsvik這不是代表你的問題。我根據你的評論收集了我的回答。 – RedFilter