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クエリからの順序)に取り込み、1つずつチェックしてから更新する必要がありますか?C#でチェックを1つずつ書くことはできますが、効率的ではないと思います。これを行うための効率的な方法は何ですか?

4

2 に答える 2

4

Number はデータベース自体で更新する必要がありますか? そうでない場合、これを保存する必要さえありますか?また、SQL クエリを作成していますか? それとも単にEntity Frameworkを使用していますか? 実際のクエリを作成していて、データを選択するときに行番号だけが必要な場合は、次のようなものを試すことができます。

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 ステートメントは、個別の RowId ごとに Number がリセットされるようにします。

于 2012-10-10T11:55:32.570 に答える
1

これは、ROW_NUMBER()、テーブル変数、および 2 つのテーブルにわたる更新で実現できます。

-- 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 に答える