5

我有一种情况,我在 SQL 方面很弱。这里是。

我已归档项目,这些项目存储有一个数字。在数据库表中是这样的。

RowId   Number  CaseId
234        1       787
235        2       787
236        3       787
237        4       787
238        5       787

这是第一次插入时的样子。但是删除后,取号3被删除,现在DB上是这样的。

RowId   Number  CaseId
234        1       787
235        2       787   
237        4       787
238        5       787

3 不见了,但我需要的是这个。

RowId   Number  CaseId
234        1       787
235        2       787   
237        3       787
238        4       787

数字也应该更新。但我想不出办法做到这一点。顺便说一句,有很多 CaseId。我不会更新整个表,我将通过 CaseId 选择它。你能告诉我怎么做吗?我正在使用 C# .NET

我是否应该将它们放入列表(从 Select 查询中对它们进行排序的方式)并一一检查然后更新它们?我可以在 C# 上一一写检查,但我认为它不会有效率。什么是有效的方法来做到这一点?

4

2 回答 2

4

Number 是否必须在数据库本身中更新?如果没有,你甚至需要存储这个吗?您还在编写 SQL 查询吗?或者只是使用实体框架?如果您正在编写实际查询,并且如果您在选择数据时只需要行号,则可以尝试以下操作:

SELECT RowId, ROW_NUMBER() OVER (ORDER BY RowId ASC) AS [Number], CaseId 
FROM [MyTable] 
WHERE CaseID = 787

编辑:正如@Mike 在评论中指出的那样,对此提出看法可能是有意义的。您可以从主表中删除 [Number] 并制作如下视图:

CREATE VIEW dbo.MyView 
AS 
    SELECT RowId, 
    ROW_NUMBER() OVER (PARTITION BY CaseId ORDER BY RowId ASC) AS Number, 
    CaseId FROM MyTable

PARTITION 语句将确保 Number 为每个不同的 RowId 重置

于 2012-10-10T11:55:32.570 回答
1

这可以通过 ROW_NUMBER()、一个表变量和跨两个表的更新来实现!

-- Declare a variable to hold case id

-- This can easily be moved into the signature
-- of a sproc.
DECLARE @caseId INT;
SELECT @caseId = 787;


-- Table variable to hold results
DECLARE @newOrder TABLE 
(
   CaseId int,
   RowId int,
   SortOrder int
)

-- Use row number to work out the new sort order
-- positions
INSERT INTO 
  @newOrder
SELECT
  CaseId,
  RowId,
  ROW_NUMBER OVER (ORDER BY [Number]) AS SortOrder
FROM
  [Cases]
WHERE
  CaseId = @caseId


-- Finally, perform a multi-table update using
-- the new sort orders from the table variable
UPDATE
  c
SET
  [Number] = o.SortOrder
FROM
  Cases c,
  @newOrder o
WHERE
  c.RowId = o.RowId
AND c.CaseId = @caseId
于 2012-10-10T11:59:06.403 回答