SQL Server에서 상위 100 레코드를 업데이트하고 싶습니다. 나는 테이블에있는 T1
필드 F1
와 F2
. T1
200 개의 레코드가 있습니다. F1
상위 100 개 레코드 의 필드 를 업데이트하고 싶습니다 . TOP 100
SQL 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