【问题标题】:Sequence Numbering in SQL ServerSQL Server 中的序列号
【发布时间】:2019-11-20 08:02:47
【问题描述】:

我有一个包含 5 条记录的表格(总是按 ID 升序排列):

ID  Sequence
1   1
2   2
3   3
4   4
8   3
9   3

所需的输出是:

ID  Sequence
1   1
2   2
3   3
4   6
8   4
9   5

【问题讨论】:

  • 你如何计算ID = 8应该有Sequence = 4(等等)?
  • @martin "如果 ID 为偶数且序列为奇数,则加 1 否则加 2,因为 id 大于 3?" :)
  • 但 ID 会因每个场景而异。确切的情况是,我已经预定义了一组从定义的模板表中填充的记录。并且在此过程中,用户输入根据记录状态插入的临时记录(例如,临时记录应插入到最后一个正在进行的状态记录之后)在这种情况下,它是第 3 条记录作为第 4 条记录记录处于打开状态。用户添加了两次临时任务,这些记录的 ID 是 8 和 9。
  • 添加的第一条临时记录是第三条记录的副本。同样,第二次添加的临时记录也是第三条记录的副本,因为两者都必须最后添加到正在进行的记录中,即第三条记录。我认为,上面的序列号有更正,最近的临时记录总是应该有序列号为 3+1。这意味着 ID=8 应该是 5,ID=9 应该是 4,ID=4 应该是 6。如果您有任何问题,请告诉我。感谢您的快速回复。
  • 更新必须针对每个场景使用一个查询。

标签: sql sql-server sql-server-2017


【解决方案1】:

对我来说看起来像是 3 个直接更新,没有必要让它复杂化:

UPDATE table SET sequence = 6 WHERE id = 4 
UPDATE table SET sequence = 4 WHERE id = 8
UPDATE table SET sequence = 5 WHERE id = 9

【讨论】:

    【解决方案2】:

    如果您想一步完成:

    update t
        set sequence = v.sequence
        from t join
             (values (4, 6), (8, 4), (9, 5)
             ) v(id, sequence)
             on t.id = v.id;
    

    如果您必须进行许多此类更新,则单独调用 update 会产生额外开销。

    【讨论】:

    • 感谢您的更新,它确实有助于找到快速解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 2011-12-13
    • 2011-10-29
    • 2017-05-08
    • 1970-01-01
    相关资源
    最近更新 更多