【问题标题】:update order column in a table but maintain the order更新表中的订单列但保持订单
【发布时间】:2014-09-23 14:20:43
【问题描述】:

我有一张桌子

id | title | F_ID  | order
----------------------------
1  | test 1| 1     | 44
2  | test 3| 1     | 3
3  | test 4| 1     | 1
4  | test 5| 2     | 1

我想将所有 F_ID 为 1 但保留订单的行的订单列更新为 +10

结果需要是

id | title | F_ID  | order
----------------------------
1  | test 1| 1     | 30
2  | test 3| 1     | 20
3  | test 4| 1     | 10
4  | test 5| 2     | 1

我可以将我想要更新的所有行插入到临时表中 然后循环行并通过 [id] 更新真实表中的每一行。

也许有更好的选择?

【问题讨论】:

  • 这种事情可能会起作用stackoverflow.com/questions/8401552/sql-increment-a-number 诀窍似乎是 SET x = X + 10
  • 不,我需要给一个全新的数字而不是增加它
  • 你的例子没有意义。如果您在订单中添加 +10,则 F_ID =1。在您的示例中,第一列下降了 14,第二列上升了 17,第三列上升了 9。
  • 我想“漂亮”我的订单并为新商品腾出“空间”。数字的变化是x所以“新顺序”从x开始并增加y,但顺序是相等的。

标签: sql-server sql-update


【解决方案1】:

我认为这应该可行:

SQL Fiddle

MS SQL Server 2008 架构设置

create table test (id int, title  varchar(49), F_ID int, [order] int)
insert test values 
(1  , 'test 1', 1, 44),
(2  , 'test 3', 1, 3),
(3  , 'test 4', 1, 1),
(4  , 'test 5', 2, 1)

查询 1

update test
set [order] = new_order
from test t
inner join (
    select 
       id, 
       new_order = ROW_NUMBER() over (partition by f_id order by [order]) * 10
    from test t
    where f_id = 1
) t2 
on t.id = t2.id

Results

查询 2

select * from test

Results

| ID |  TITLE | F_ID | ORDER |
|----|--------|------|-------|
|  1 | test 1 |    1 |    30 |
|  2 | test 3 |    1 |    20 |
|  3 | test 4 |    1 |    10 |
|  4 | test 5 |    2 |     1 |

【讨论】:

    【解决方案2】:

    嗯,可能有比这更好的解决方案,但您可以使用递归 CTE 来尝试。

    ;WITH updCTE
    AS 
    (
        SELECT 30 AS YourOrder, 1 AS id
    
        UNION ALL
    
        SELECT YourOrder - 10 AS YourOrder, id + 1 AS id
        FROM updCTE
        WHERE YourOrder > 1
    )
    UPDATE YourTable
    SET [order] = YourOrder
    FROM updCTE
    JOIN YourTable ON updCTE.id = YourTable.id
    WHERE YourTable.F_ID = 1
    ORDER BY YourTable.id
    

    【讨论】:

    • 我的id不是从1开始加1,可以是任意数字
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 2018-05-12
    • 2015-02-15
    相关资源
    最近更新 更多