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
Odpowiedz
Uwaga, nawiasy są wymagane dla instrukcji UPDATE:
update top (100) table1 set field1 = 1
Każdy pomysł jak użyć 'order przez "również? –
@JoePhilllips Użyj odpowiedzi Martina Smitha na zamówienie przez – jjxtra
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. –
update tb set f1=1 where id in (select top 100 id from tb where f1=0)
Skorzystanie z tej konstrukcji jest cholernie powolne ... – Lu4
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'
Powód przegranej? 'TOP' bez' ORDER BY' ** jest ** bez znaczenia. Otrzymujesz nieokreślone wiersze '100'. –
nic nie znaczący jak w żadnym realnym świecie – Rohit
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
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.
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
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
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
.
Ten link może Ci pomóc http://www.codefari.com/2015/10/how-can-i-update-top-10-records-in-sql.html – Singh