-2

これは私のテーブルです:

ID    int (Primary Key)
Name
Order 

行を上下に移動しようとしています。だから私は注文フィールドを更新したい。

UPDATE Technology 
SET Order = Order + 1 
WHERE ID = 2;
4

4 に答える 4

1

列名に問題があると思いますorderorderはキーワードなので、直接使用することはできません。この方法を試してください:

Update Technology set [Order]=[Order]+1 Where ID=2

これを試して:

update menu
set [order]=m2.[order]+1
from menu  
join menu m2 on menu.[Order]= m2.[Order]-1
于 2013-07-25T11:21:52.820 に答える
1

OK、2 つのアイテム間でスワップ操作を行いたいと仮定すると、SET 句のロジックを変更できます。

--table setup
CREATE TABLE #Technology
(
 Id int,
  [Order] int,
  Name varchar(10)

)

INSERT INTO
    #Technology
    (
        Id,
        [Order],
        Name
    )
VALUES
    (1, 1, 'Menu1'),
    (2, 2, 'Menu2'),
    (0, 0, 'Menu0'),
    (3, 3, 'Menu3')

--proof of original order
SELECT
    *
FROM
    #Technology

UPDATE
    #Technology
SET
    [Order] =
    (
        SELECT
            [Order]
        FROM
            #Technology T1
        WHERE
            Id IN (1, 2)
            AND #Technology.Id <> T1.Id -- get the order of the *other* item in the pair
    ) -- this subquery works because we only have two ids do work with
WHERE
    Id IN (1, 2)

--new order
SELECT
    *
FROM
    #Technology
順序が ID 2 の順序よりも大きいすべての行を確実に取得するには、別の where 句が必要です。

UPDATE Technology SET [注文] = [注文] + 1 WHERE [注文] >= ( SELECT [注文] FROM テクノロジー WHERE ID = 2 )

これにより、重複した注文がないことが保証されます (重複した注文が存在しない場合)。

于 2013-07-25T11:38:43.847 に答える
0

あなたのコメントから、2 つの注文を交換したいと思います。私はおそらくストアドプロシージャでこれを行うでしょう

CREATE PROC swapOrders @order1 int, @order2 int
AS BEGIN
    IF NOT EXISTS (SELECT * FROM Technology WHERE order = @order1)
    OR NOT EXISTS (SELECT * FROM Technology WHERE order = @order2)
        RETURN    --if either of the orders aren't valid don't do anything. You may want to log or raise an error here
    ELSE
        UPDATE Technology
        SET order = CASE order WHEN @order1 THEN @order2 WHEN @order2 THEN @order1 ELSE order END
END

これは、順序が一意であると仮定しています

于 2013-07-25T12:28:10.207 に答える