[sql] SQL Server에서 상위 100 개의 레코드를 업데이트하는 방법

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