2012-10-10 16 views
5

Durumum var ve SQL'de zayıflıyorum. İşte burada.SQL, siparişi kaybeden bir sütunu mu güncelliyor?

Arşivlenmiş öğelerim var, bunlar bir numarayla depolanıyor. Bu veritabanı tablosunda böyle.

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

İlk takıldığında böyle görünüyor. Ama silme işleminden sonra, 3 Numaralı Al silinir, Şimdi DB'deki gibi.

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

3 gitmiş ama ne gerekir bu mesafesindedir.

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

Sayılar da güncelleştirilmelidir. Ama bunu yapmanın bir yolunu anlayamıyorum. Bu arada, birçok CaseId var. Tüm tabloyu güncellemem, bir CaseId ile seçeceğim. Bunu nasıl yapacağımı söyler misin? C# .NET

'u kullanıyorum Bunları bir listeye (sorgu seçtikleri şekilde sırayla) almalı mıyım ve tek tek kontrol etmeli ve sonra bunları güncelleştirmeli miyim? Çekini C# ile tek tek yazabilirim ama bence verimli olmayacak. Bunu yapmanın etkili bir yolu nedir?

+2

"Numara" yı kaydetmeniz gerekiyor mu? –

+2

O zaman "true" sütununa ihtiyacınız yok "Number". Sadece OrderBy RowId ve row_number() –

+1

kullanın. Veritabanında numara saklamamayı tavsiye ederim. Sonucun üzerine ihtiyacınız olduğunda, sadece Row_number() ile bir SELECT sorgusu yazınız. Daha fazla bilgi için bkz: http://msdn.microsoft.com/en-us/library/ms186734.aspx –

cevap

4

Numara, veritabanında kendisinin güncellenmesi gerekiyor mu? Değilse, bunu saklamana bile gerek var mı? Ayrıca SQL sorguları yazıyor musunuz? Veya Entity Framework'ü mi kullanıyorsunuz?

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

EDIT: Eğer gerçek sorguları yazıyorsanız ve sadece satır numarasını istiyorsanız seçtiğinizde veri gibi bir şey deneyebilirsiniz geri yorumlarında @ Mike işaret ettiği gibi, muhtemelen yapacak Bunun dışında bir bakış açısı hissetmek. ,) Bir BÖLME açıklamada Numarası Bu ROW_NUMBER (ile elde edilebilir her ayrı rowID

+1

+1 - Mümkün olduğunda daha iyi bir çözümdür ve Entity Framework tarafından hala desteklenebilecek bir görünüm veya saklı prosedür oluşturulabilir. –

+0

Numarayı DB'ye kaydetmem gerekiyor. Arama için kullanılır. Bunu önce veritabanına almadan önce güncelleştirebilir miyim? – Ada

+0

@Ada, kesinlikle bir görüşe karşı sorgulayabilirsiniz ve bunun ** ciddi ** performans sorunlarına yol açtığını fark etmedikçe bu şekilde yapardım. Tablodaki bu sorudaki gibi bir tamsayı değerinin saklanması, bir satış siparişinin toplam fiyatının depolanması gibidir - bu kötü bir fikir çünkü bakımı çok zor. –

1

için sıfırlar sağlayacağız

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

: Birincil tablodan [Numarası] kaldırmak ve benzeri bir görünüm yapabilirsiniz Tablo değişken ve iki tablo boyunca bir güncelleme!

-- 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 
İlgili konular