2009-07-29 11 views
303

Chcę zaktualizować 100 najlepszych rekordów w SQL Server. Mam tabelę T1 z polami F1 i F2. T1 ma 200 rekordów. Chcę zaktualizować pole F1 w 100 najlepszych rekordach. Jak mogę zaktualizować na podstawie TOP 100 w SQL Server?Jak mogę zaktualizować 100 najlepszych rekordów w serwerze sql

+0

Ten link może Ci pomóc http://www.codefari.com/2015/10/how-can-i-update-top-10-records-in-sql.html – Singh

Odpowiedz

522

Uwaga, nawiasy są wymagane dla instrukcji UPDATE:

update top (100) table1 set field1 = 1 
+16

Każdy pomysł jak użyć 'order przez "również? –

+4

@JoePhilllips Użyj odpowiedzi Martina Smitha na zamówienie przez – jjxtra

+0

Nie są to jednak 100 najlepszych rekordów, ale po prostu 100 arbitralnie wybranych rekordów. Top 100 zawierałby kolejność uporządkowania rekordów. –

9
update tb set f1=1 where id in (select top 100 id from tb where f1=0) 
+15

Skorzystanie z tej konstrukcji jest cholernie powolne ... – Lu4

242

Bez ORDER BY cała idea TOP nie ma większego sensu. Musisz mieć spójną definicję tego, który kierunek jest "w górę", a który "w dół", aby pojęcie wierzchołka było znaczące.

Mimo to SQL Server pozwala na to, ale doesn't guarantee a deterministic result.

Składnia UPDATE TOP w zaakceptowanej odpowiedzi nie obsługuje klauzuli ORDER BY, ale można tutaj uzyskać semantykę deterministyczną za pomocą CTE lub tabeli pochodnej w celu zdefiniowania pożądanej kolejności sortowania, jak poniżej.

;WITH CTE AS 
( 
SELECT TOP 100 * 
FROM T1 
ORDER BY F2 
) 
UPDATE CTE SET F1='foo' 
+16

Powód przegranej? 'TOP' bez' ORDER BY' ** jest ** bez znaczenia. Otrzymujesz nieokreślone wiersze '100'. –

+0

nic nie znaczący jak w żadnym realnym świecie – Rohit

+57

Mówisz, że bez znaczenia, ale to nieprawda.Przyznaję, że/zwykle /, kiedy używasz 'TOP' odds, powinieneś używać go z' ORDER BY', ponieważ to, co cię interesuje, jest jak "najbardziej" lub "najmniej" czegoś. W innych przypadkach możesz być zainteresowany tylko uzyskaniem jednego pasującego rekordu. Lubię mnie dzisiaj! Musiałem rozwiązywać problemy z danymi (cykle) pojedynczo. Cały proces naprawy dotyczył skryptu db, interwencji użytkownika i niektórych operacji aplikacji. Nie obchodziło nas, który rekord został obsłużony jako pierwszy. Po prostu obchodziło nas, że zajmujemy się nimi po jednym na raz. – MetaFight

12

dla takich jak ja nadal tkwi w SQL Server 2000, SET ROWCOUNT {number}; można stosować przed UPDATE zapytania

SET ROWCOUNT 100; 
UPDATE Table SET ..; 
SET ROWCOUNT 0; 

ograniczy aktualizację do 100 wierszy

Zostało ono przestarzałe przynajmniej od SQL 2005, ale od SQL 2012 nadal działa. EDIT: został zabity w SQL 2014. Użycie SET ROWCOUNT nie wpłynie na polecenia DELETE, INSERT i UPDATE w SQL Server 2014 i nowszych wersjach.

+0

ZESTAW ROWCOUNT wpływa na wyzwalacze oraz aktualizowaną komendę. Jeśli masz zestaw kasowania kaskadowego, może on zawieść transakcji, jeśli w tabeli podrzędnej znajduje się więcej niż rzędów wierszy potomka. – EricI

+0

Z tym powiedziane, SET ROWCOUNT @RowCountParameter; jest poprawna składnia, podczas gdy SELECT TOP @RowCountParamter * FROM TableName jest niepoprawna. Jeśli chcesz skonfigurować aktualizowane wiersze, SET ROWCOUNT # jest obecnie lepszym rozwiązaniem, o ile nie masz tabel podrzędnych z włączoną funkcją Cascade Delete. – EricI

3

Co jest jeszcze ciekawsze, to fakt, że można użyć wbudowanej funkcji wyceny stołowej, aby wybrać, które (i ile z numerów TOP) zaktualizować. Czyli:

UPDATE MyTable 
SET [email protected] 
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3) 

Dla funkcji tabeli wyceniane masz coś ciekawego do wybierz wiersz zaktualizować jak:

CREATE FUNCTION tvfSelectLatestRowOfMyTableMatchingCriteria 
(
    @Param1 INT, 
    @Param2 INT, 
    @Param3 INT 
) 
RETURNS TABLE AS RETURN 
(
    SELECT TOP(1) MyTable.* 
    FROM MyTable 
    JOIN MyOtherTable 
     ON ... 
    JOIN WhoKnowsWhatElse 
     ON ... 
    WHERE [email protected] AND ... 
    ORDER BY MyTable.SomeDate DESC 
) 

... i leży (moim skromnym zdaniem) prawdziwej władzy aktualizowania tylko wybranych górnych rzędów w sposób deterministyczny, przy jednoczesnym uproszczeniu składni instrukcji UPDATE.

Powiązane problemy