2009-08-31 17 views
9

Veritabanı tablosundaki en üst 400 satırı güncellemek istiyorum. Sözde SQL aşağıda, bunu nasıl yapabilirim?TOP 400 nasıl güncellenmeli?

UPDATE top (400) db.dbo.tbl 
SET column1 = 2 
WHERE column2 = 1 
    AND column1 is null 
+0

Soru nedir? – RaYell

+0

SqlServer'ı kullandığınızı farz ediyorum. Bu doğru mu? Ayrıca, HLGEM'in cevabına dikkat edin, içinde bir siparişiniz olmadıkça, bu sorguyu her çalıştırdığınızda aynı sonuç kümesini alacağınızın garantisi yoktur. –

+0

yeniden etiketlendi, bunu yapmak için SQL Server kullanmak zorunda kalacağınız gibi başka bir popüler DBMS TOP 400 gibi bir deyim var – tekiegreg

cevap

5

Top 400'ü nasıl belirlersiniz? Herhangi bir emir olmadan aynı setin her zaman seçileceği ve dolayısıyla yanlış kayıtların güncellenebileceği bir guanantee yoktur. Üst 400, ölçüt başka türde eklemek isteyebilirsiniz HANGİ garanti etmenin bir yolu yoktur olarak

9
UPDATE db.dbo.tbl SET column1 = 2 WHERE 
primaryID IN (
    SELECT TOP (400) primarkyID FROM db.dbo.tbl 
    WHERE column2 = 1 AND column1 IS NULL 
) 

Ama bu sevmiyorum. Ve hatta alt sorguya göre bir Sipariş.

4

Muhtemelen böyle bir şey arıyorsanız: Kimlik tablonun birincil anahtar sütundur

update db.dbo.tbl set column1 = 2 
where ID in (
    select top 400 ID from db.dbo.tbl 
    where column2 = 1 and column1 is null --the criteria have been moved here 
    order by ID --order by clause recommended 
) 

.

+0

Sorgulamada 'TOP' komut satırını kullanmak yerine 400 satırını kullanabilirsiniz http: // msdn .microsoft.com/tr-us/library/ms188774.aspx – pjp

+3

SET ROWCOUNT kullanımdan kaldırılmıştır. –

+0

@Dave: Emin misin? MSDN belgelerinde belgelenmiş olanları göremiyorum http://msdn.microsoft.com/en-us/library/ms188774.aspx – pjp

4

SQL Server 2008 kullanıyorsanız, "üst n" sözdizimi, silme ve güncelleştirme deyimleri üzerinde çalışacaktır. Aksi takdirde, bir alt sorguda veya türetilmiş bir tabloda birincil anahtarları tanımladığınız burada listelenen diğer yöntemler iyi çalışır. Diğerlerinin yaptığı gibi, "sipariş ver" seçeneği şiddetle önerilir veya güncellediğiniz satırlar bir sorgudan diğerine farklılık gösterebilir.

+0

Ayrıca, SQL 2005 üzerinde çalışır, ancak parantez gerektirir: TOP (n). SQL 2005 BOL, UPDATE ifadesi, TOP() yan tümcesine bakın. – Rick

5
WITH q AS 
     (
     SELECT TOP 400 * 
     FROM db.dbo.tb 
     WHERE column2 = 1 
       AND column1 is null 
     ORDER BY 
       column3 -- choose your order! 
     ) 
UPDATE q 
SET  column2 = 2 
+0

@Quassnoi, sadece merak, bir alt seçim yerine CTE kullanmanın yararı nedir? –

+1

'jmgant':" Oracle "gibi bir alt seçimi güncelleyemezsiniz, UPDATE (SELECT TOP 400 *…) SET…' başarısız olur. Başkalarının önerdiği bir "IN" koşulu, burada fazladan bir ekstra "JOIN" ile sonuçlanır. – Quassnoi

+1

Ayrıca, bu bir "PRIMARY KEY" yoksa veya bir "PRIMARY KEY" (SQL Server'da) bir kompozitiniz olmasa bile çalışacaktır. "IN" yükleminde birden fazla sütun kullanamazsınız) – Quassnoi

İlgili konular