SQL Server에서 상위 100 레코드를 업데이트하고 싶습니다. 나는 테이블에있는 T1필드 F1와 F2. T1200 개의 레코드가 있습니다. F1상위 100 개 레코드 의 필드 를 업데이트하고 싶습니다 . TOP 100SQL Server를 기반으로 업데이트하려면 어떻게 해야합니까?
답변
UPDATE 문에는 괄호가 필요합니다.
update top (100) table1 set field1 = 1
답변
없이 ORDER BY전체 아이디어는 TOP많은 이해가되지 않습니다. top의 개념이 의미가 있으려면 어느 방향이 “위”이고 어떤 방향이 “아래”인지에 대한 일관된 정의가 필요합니다.
그럼에도 불구하고 SQL Server는이를 허용하지만 결정적인 결과를 보장하지는 않습니다 .
UPDATE TOP허용 된 답변 의 구문은 ORDER BY절을 지원하지 않지만 CTE 또는 파생 테이블을 사용하여 다음과 같이 원하는 정렬 순서를 정의하여 결정 론적 의미를 얻을 수 있습니다.
;WITH CTE AS
(
SELECT TOP 100 *
FROM T1
ORDER BY F2
)
UPDATE CTE SET F1='foo'
답변
나와 같은 사람들은 여전히 SQL Server 2000을 고수 SET ROWCOUNT {number};하고 UPDATE쿼리 전에 사용할 수 있습니다.
SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;
업데이트를 100 행으로 제한합니다
SQL 2005부터는 더 이상 사용되지 않지만 SQL 2017에서는 여전히 작동합니다.
https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
답변
update tb set f1=1 where id in (select top 100 id from tb where f1=0)
답변
더 멋진 점은 인라인 테이블 반환 함수를 사용하여 업데이트 할 (및 비아 TOP) 행 을 선택할 수 있다는 것 입니다. 그건:
UPDATE MyTable
SET Column1=@Value1
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)
테이블 반환 함수의 경우 다음과 같이 업데이트 할 행을 선택하는 것이 좋습니다.
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 MyTable.SomeColumn=@Param1 AND ...
ORDER BY MyTable.SomeDate DESC
)
… 그리고 (내 겸손한 견해로는) 선택된 상위 행만 결정 론적으로 업데이트하면서 동시에 UPDATE명령문 의 구문을 단순화하는 진정한 힘이 있습니다.
답변
시험:
UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY
CreatedDate DESC)
답변
별명과 조인을 사용하여 select에서 업데이트 할 수도 있습니다.
UPDATE TOP (500) T
SET T.SomeColumn = 'Value'
FROM SomeTable T
INNER JOIN OtherTable O ON O.OtherTableFK = T.SomeTablePK
WHERE T.SomeOtherColumn = 1
