2012-10-10 44 views
5

我有一種情況,我在SQL方面很弱。這裏是。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#上逐個寫一個檢查,但我認爲它效率不高。什麼是有效的方法來做到這一點?

+2

您是否需要存儲「數字」?您不能只是在您選擇關閉表格時計算它嗎? –

+2

然後你不需要任何「真」列「數字」。只需OrderBy RowId並使用row_number() –

+1

在這種情況下,我會建議不要在您的數據庫中存儲Number。無論何時您需要上述結果,只需使用Row_number()編寫SELECT查詢。有關更多詳細信息,請參閱:http://msdn.microsoft.com/en-us/library/ms186734.aspx –

回答

4

是否必須在數據庫本身中更新數字?如果沒有,你甚至需要存儲這個?你還在編寫SQL查詢嗎?或者只是使用實體框架?如果你正在寫的實際查詢,如果你只是想行號當您選擇將數據備份,你可以嘗試這樣的:

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

編輯:正如評論所指出的@Mike,它很可能會令意識到這一點。您可以從主表中刪除[編號]和作出這樣一個觀點:

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

分區聲明將確保數重置每個不同的RowId的

+1

+1 - 如果可能的話,這是一個更好的解決方案,並且可以創建一個視圖或存儲過程,這個視圖或存儲過程仍然可以被實體框架利用。 –

+0

我必須將數字存儲在數據庫中。它用於搜索。我可以在數據庫中執行此操作,而不必先檢索它然後更新嗎? – Ada

+0

@Ada,你當然可以查詢一個視圖,除非你發現它會導致**嚴重的**性能問題,我會這樣做。在表格中存儲一個像這個問題那樣的整數值就像存儲銷售訂單的總價格 - 這是一個壞主意,因爲它很難維護。 –

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