2013-05-30 29 views
8

Tablo 1'de değerleri 1 üzerinden kullanmak için bir sütunu güncellemeye çalışıyorum (kayıt sayısıyla belirlenen bir maksimum sayı).Bir tablonun bir sütununu ölçekleme değerine güncelleştirme

Bu hakkın açıklanıp açıklanmadığını bilmiyorum, bu yüzden güncellemeye çalıştığım verilerle bir SQLFiddle kurdum.

SQL FIDDLE

I (maksimum sayıda) 1 ile Sürüm sütun ayarlamak istediğiniz

. Bu sorguyu Sürüm numarasını ölçekli olarak yeniden yazmanın bir yolu var mı? As içinde , ben ilk kayıt 2'yi kullanmak için 1, ikinci kayıt kullanmak istiyorum, vb ...

anlarım kadarıyla
UPDATE Documents 
SET Version = 1 
+1

İstediğiniz sonucu gönderebilir misiniz? Hala istediğinizi elde edemiyorum – Lamak

cevap

4

Bir CTE ile yapmak ve hiçbir katılır edebilirsiniz:

with RankedDocument as 
(
    select * 
    , rn = row_number() over (order by ID) 
    from Documents 
) 
update RankedDocument 
set Version = rn 

SQL Fiddle with demo.

+0

Bu, leoinfo'nun yayınladığı versiyondan daha kolay anlaşılıyor. Ayrıca, daha fazla verimli olacağı düşünülüyor çünkü hiçbir katılım söz konusu değil. – Zack

3

, bir version numarasına sahip olacak Documents her kaydını istiyorum hangi 1'den hareket eden bir sayıdır ..... İ

Sen artan version ve sonra UPDATE geri orijinal tabloya almak için geçici bir tablo ve ROW_NUMBER tekniği kullanabilirsiniz.

CREATE TABLE #Temp (ID int, Version int) 

INSERT INTO #Temp (ID, Version) 
SELECT ID, ROW_NUMBER() OVER (ORDER BY ID ASC) 
FROM Documents 

UPDATE Doc 
SET Version = TT.Version 
FROM Documents AS Doc INNER JOIN #Temp AS TT ON Doc.ID = TT.ID 

DROP TABLE #Temp 

Ben doğru anlamak

..

1

bu deneyin: İhtiyacınız birine (versionId ASC ORDER BY) sırasını değiştirebilirsiniz

;WITH list AS (
    SELECT 
     ID 
    , Version = ROW_NUMBER() OVER(ORDER BY VersionID ASC) 
    FROM Documents 
) 
UPDATE d SET 
    d.Version = x.Version 
FROM Documents AS d 
INNER JOIN list as x ON d.ID=x.ID 

SELECT * FROM Documents 

.

+0

Sürümünüzü kullandım ve ihtiyacım olan yere ulaştım. Geçen yıl Ekim ayından bu yana sadece SQL ile çalışıyorum ve ROW_NUMBER() cihazını hiç duymadım, bu yüzden nasıl kullanacağımı gösterdiğiniz için teşekkür ederim! http://sqlfiddle.com/#!3/a09ed/48 – Zack

+0

Bu sorgunun * başında * bir noktalı virgül bulunmasının bir nedeni var mı? – Zack

+2

Bu sadece bir sorun yaratmamak için oluşturduğum bir alışkanlıktır ... :) Kodunuzda İLE önce ne olduğuna bağlı olarak, yukarıdaki deyim, bir bağımsız değişken/seçenek olarak WITH'ı kabul ederse, kod başarısız olabilir. Örneğin, "MARK İLE BAŞLANGIÇ İŞLEMİ". – leoinfo

İlgili konular