2009-08-31 15 views
9

Chciałbym zaktualizować top 400 wierszy w tabeli bazy danych. Pseudo SQL jest poniżej, jak mogę to zrobić?Jak ZAKTUALIZOWAĆ TOP 400?

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

Na czym polega pytanie? – RaYell

+0

Zakładam, że używasz SqlServer. Czy to jest poprawne? Zwróć także uwagę na odpowiedź HLGEM, nie ma gwarancji, że otrzymasz taki sam zestaw wyników za każdym razem, gdy uruchomisz to zapytanie, chyba że masz w nim zlecenie. –

+0

retagged, aby to zrobić, musiałbyś używać SQL Server, ponieważ żaden inny popularny DBMS nie ma instrukcji TOP 400 jak – tekiegreg

Odpowiedz

5

Jak określić top 400? Bez zlecenia nie można zagwarantować, że ten sam zestaw będzie zawsze wybrany, a zatem błędne zapisy mogą zostać zaktualizowane.

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 
) 

Ale nie podoba mi się to, ponieważ nie ma sposobu, aby zagwarantować, KTÓREM 400 najlepszych, może chcesz dodać jakiś inny rodzaj kryteriów. I nawet zamówienie do podkwerendy.

4

Pewnie patrząc na coś takiego:

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 
) 

gdzie ID to kolumna klucz podstawowy tabeli.

+0

Możesz również użyć 'set rowcount 400' zamiast używać' TOP' w zapytaniu zobacz http: // msdn .microsoft.com/en-us/library/ms188774.aspx – pjp

+3

Poza tym, że SET ROWCOUNT jest przestarzałe. –

+0

@Dave: Jesteś pewien? Nie widzę tego udokumentowanego w dokumentach MSDN http://msdn.microsoft.com/en-us/library/ms188774.aspx – pjp

4

Jeśli korzystasz z programu SQL Server 2008, składnia "top n" będzie działać na wyciągach i aktualizacjach. W przeciwnym razie inne metody wymienione tutaj, w których identyfikujesz klucze podstawowe w podkwerendie lub tabeli pochodnej, będą działać poprawnie. Podobnie jak inni, zaleca się "zamówienie według" lub zaktualizowane wiersze mogą się różnić w zależności od zapytania.

+0

Działa również w SQL 2005, ale wymaga nawiasów: TOP (n). Patrz instrukcja SQL 2005 BOL, UPDATE, TOP(). – 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, po prostu ciekawa, jaka jest korzyść z używania CTE zamiast podselekcji? –

+1

'@ jmgant': nie można zaktualizować podselekcji jak w' Oracle', 'UPDATE (SELECT TOP 400 * ...) SET ...' nie powiedzie się. Warunek 'IN' zaproponowany przez innych po prostu skutkuje dodatkowym' JOIN', który jest tutaj nadmiarowy. – Quassnoi

+1

Poza tym to zadziała, nawet jeśli nie masz klucza "PRIMARY KEY" lub kompozytowego 'PRIMARY KEY' (w' SQL Server', nie możesz użyć więcej niż jednej kolumny w predykacie 'IN') – Quassnoi