【问题标题】:Manual sorting sequence problem on delete删除时手动排序顺序问题
【发布时间】:2020-02-11 11:12:34
【问题描述】:

我有这个 SQL

;WITH Sorted AS (
    SELECT  authorid,
            ROW_NUMBER() OVER (ORDER BY sorted) AS RowNumber
    FROM    author
    WHERE   authorid <> @id
)

UPDATE  p
SET     p.sorted = 
        (CASE 
            WHEN p.authorid =  @id THEN @id
            WHEN s.RowNumber >= @id THEN s.RowNumber + 1
            ELSE s.RowNumber
        END)
FROM    author p
        LEFT JOIN Sorted s ON p.authorid = s.authorid

但是这段代码是有问题的,因为我将值加了 1,如果序列是像 1,2,3,4,5 这样的顺序,它就可以工作。

但是如果删除一条记录,它会搞砸一切

所以克服了这个问题,我在想我是否可以使用primarykey 列作为排序列中的相同值,即使我删除,排序也应该没有任何问题,上面的代码将对记录进行排序正确。

因为在某一时刻,只有 1 个项目会向上或向下排序。

更像是行将被交换,

知道我怎样才能让它工作吗?

这里是sample data

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。并解释代码应该做什么。
  • CFFiddle 坏了。另外请确保问题是独立的,而不依赖于外部链接。并确保将示例数据添加为表格文本,而不是图像或外部链接。
  • 破碎是什么意思
  • 真正有用的是样本数据和所需的输出。冷聚变小提琴不是答案。看这里。 minimal reproducible example

标签: sql sql-server sorting sql-update


【解决方案1】:

我无法理解您为什么要在表格中保留一个单独的连续数字序列。每次从author 表中选择时,维护此序列可能比动态计算排序序列慢得多。

无论如何,假设你有充分的理由,这里是代码:

;WITH Sorted AS (
    SELECT  authorid,
            ROW_NUMBER() OVER ( ORDER BY authorid ) AS RowNumber
    FROM    author
    -- If you want to exclude a specific author from sorting
    -- This will also not update sorted value for this author
    -- WHERE authorid <> @id
)
UPDATE a
SET sorted = RowNumber
FROM Sorted AS a

评论:

如果您这样做是为了分页,那么here is a typical method 这样做。

RE:“因为在某一时刻,只有 1 个项目会向上或向下排序。” - 数据库表不是链接列表,您可以按照自己喜欢的顺序移动(重新链接)项目。磁盘上数据库表数据的顺序由可用空间可用性和数据大小决定(类似于操作系统中文件空间的分配方式),除非有聚集索引,否则不会按照sorted列的顺序。如果您有一个聚集索引,那么 SQL Server 将“尝试维护”该顺序,但它不会重新排序磁盘上已经存在的数据,除非您明确告诉它 (ALTER INDEX ... ON ... REBUILD)。

【讨论】:

  • 谢谢@alex,但问题是当我删除整个排序时会搞砸,这就是我要解决的问题
  • 我不明白如果你在之后立即运行UPDATE 语句会搞砸。你能准确地澄清什么搞砸了,是排序列中的值还是返回记录的顺序?注意:在我的查询中,您可以将 OVER ( ORDER BY authorid ) 更改为 OVER ( ORDER BY sorted ) 或任何排序列。
  • 所以在我的原始代码中,记录的传递的 id 将去哪里,我使用的是获取该记录并更新的 idd,它,您提供了一个没有传递任何 id 的查询,并且这将如何操作数据,我仍然很困惑,我尝试通过传递 authorid 来运行您的查询,这是有道理的,但是我将如何在我的代码中进行这项工作,我仍然迷失在黑暗中
  • 您不需要传递作者 ID,如果您事先删除了记录,正如您所说的那样。要么我误解了你,要么你应该阅读一下数据库的工作原理。
猜你喜欢
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 2016-06-07
  • 2019-12-04
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多