Sql 如何更新订单

Sql 如何更新订单,sql,tsql,Sql,Tsql,这是我的桌子: ID int (Primary Key) Name Order 我正试着上移/下移我的行。所以我想更新订单字段 UPDATE Technology SET Order = Order + 1 WHERE ID = 2; 我猜您对列名顺序有问题。订单是一个关键字,因此不能直接使用它。试着这样做: Update Technology set [Order]=[Order]+1 Where ID=2 试试这个: update menu set [order]=m2.[

这是我的桌子:

ID    int (Primary Key)
Name
Order 
我正试着上移/下移我的行。所以我想更新订单字段

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

我猜您对列名顺序有问题。订单是一个关键字,因此不能直接使用它。试着这样做:

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

因为您只更新了一条记录,ID=2的记录,那么很明显,它的订单号将与我假设的ID=3的记录相同

对于所有ID,您可能希望增加所有订单号。这样,您的表中就不会有重复的订单号。要做到这一点,只需在不使用WHERE子句的情况下运行查询


好的,假设您想在两个项之间执行交换操作,您可以更改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子句。 更新技术 设置[订单]=[订单]+1 其中[订单]>= 选择[订单] 来自技术 其中ID=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


这是假设顺序是唯一的

您能否进一步解释您的问题并提供样本数据和预期结果。您是否希望将每行的顺序增加1?我希望更改顺序=顺序+1;没关系。但当我做这件事的时候,一个订单和另一个订单是一样的。确保订单是一个可以做加法的数据类型,即SET order=convertvarcharmax,convertint,order+1I。但有两行的顺序是相同的。我要一阶=阶+1,另一阶=阶-1column@AzadCebiyev在这种情况下,应该如何订购happens@AzadCebiyev应该增加还是减少?可能是这样的:[Order]=[Order]+ID?@AzadCebiyev您说过您有两行,其中的顺序相同。但是MenuA:Order=1和MenuB:Order=2是不一样的。@AzadCebiyev你能告诉我们你在技术方面有什么以及你期望得到什么结果吗?不。例如:MenuA:Order=1和MenuB:Order=2。当MenuB:Order=1时| | MenuA:Order=2@AzadCebiyev嗯,这会让事情变得明朗一点。。你可以在问题中添加更多关于你的问题的细节,比如什么是上下文。这将有助于我们了解问题的解决方案是什么。然后,也许我们可以提供更好的解决方案。MenuA:Order=1和MenuB:Order=2。当MenuB:Order=1时| | MenuA:Order=2@AzadCebiyev例如我实际上不知道那是什么意思。请编辑您的问题,使其更能描述您的目标。@AnonymousDownvoter:为什么?这是菜单。“我想上下移动菜单。@彼得·杰德对不起,我误解了这个问题
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