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


393

SQL Server에서 상위 100 레코드를 업데이트하고 싶습니다. 나는 테이블에있는 T1필드 F1F2. T1200 개의 레코드가 있습니다. F1상위 100 개 레코드 의 필드 를 업데이트하고 싶습니다 . TOP 100SQL Server를 기반으로 업데이트하려면 어떻게 해야합니까?

답변:


684

UPDATE 문에는 괄호가 필요합니다.

update top (100) table1 set field1 = 1

28
사용법 order by도 잘 알고 있습니까?
Joe Phillips

8
@JoePhilllips Martin Smith 답변을 사용하여 주문하십시오
jjxtra

그러나 이러한 레코드는 상위 100 개 레코드가 아니라 임의로 선택한 100 개 레코드입니다. 상위 100 개에는 레코드 순위를 매기는 순서가 포함됩니다.
Thorsten Kettner

1
이것은 "질문 된대로"라는 질문에 대답하지만 TOP은 어떤 ORDER 없이는 의미가 없습니다 (예측할 수 없습니다). Martin Smith의 답변을 참조하십시오.
Andy G

1
btw : 괄호가 중요합니다!
Simon_Weaver

300

없이 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'

71
무의미한 말이지 만 사실이 아닙니다. 나는 / usually /, TOP확률을 사용할 때 ORDER BY관심있는 것이 "가장" "최소한"것과 같기 때문에 함께 사용해야한다는 것을 인정한다 . 그러나 다른 경우에는 일치하는 레코드를 하나만 얻는 데 관심이있을 수 있습니다. 오늘 나처럼! 한 번에 하나씩 데이터 문제 (사이클)를 수정해야했습니다. 전체 수정 프로세스에는 db 스크립트, 일부 사용자 개입 및 일부 응용 프로그램 작업이 포함되었습니다. 우리는 WHICH 기록이 먼저 처리되는 것을 신경 쓰지 않았습니다. 우리는 방금 한 번에 하나씩 처리하고 있다고 생각했습니다.
MetaFight

17
@MetaFight 그러나 WHERE이전에 처리 된 레코드를 제외 하는 조항 이 있었을 것 입니다. 서면 답변과 대답은 의미가 없습니다. BTW : 테이블을 대기열로 사용하는 경우 이는 매우 유용한 링크입니다.
Martin Smith

10
비동기 프로세스를 실행할 수 있도록 순서없이 top을 사용해야합니다. where 절에는 이미 처리 된 항목이 포함되지 않지만 한 번에 너무 많은 항목 만 처리 할 수 ​​있습니다. 따라서 완벽하게 유효한 사용 사례가 있습니다.
Jeff Davis

4
@Martin Smith : 한 번에 10000으로 일괄 업데이트를 원한다고 가정 해 봅시다. 이것을 잘 사용하는 것처럼 보이며 순서는 중요하지 않습니다. 이것이 어떻게 "말이되지 않습니다"?
Jay Sullivan

5
@notfed 위의 주석에서 이미 논의 된 것과 동일한 경우입니다. 이 경우에 쿼리 할 수 없습니다 허용 대답이 것의 하나 같이? where동일한 행을 반복해서 처리하지 않으려면 절이 필요 합니다.
Martin Smith

14

나와 같은 사람들은 여전히 ​​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


1
SET ROWCOUNT는 트리거와 업데이트중인 명령에 영향을줍니다. 계단식 삭제 세트가있는 경우, 하위 테이블에 하위 행의 행 수보다 많은 수가 있으면 트랜잭션이 실패 할 수 있습니다.
EricI

그렇게해서 SET ROWCOUNT @RowCountParameter; SELECT 구문 @RowCountParamter * FROM TableName은 유효하지 않지만 유효한 구문입니다. 계단식 삭제가 활성화 된 자식 테이블이없는 경우 업데이트되는 행을 구성해야하는 경우 현재 SET ROWCOUNT #가 더 나은 옵션입니다.
EricI

SQL Server 2017에서는 이제 TOP 절에서 @variable을 사용할 수 있습니다. docs.microsoft.com/en-us/sql/t-sql/queries/…
Alexandr Zarubkin

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

4

더 멋진 점은 인라인 테이블 반환 함수를 사용하여 업데이트 할 (및 비아 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명령문 의 구문을 단순화하는 진정한 힘이 있습니다.


0

시험:

UPDATE Dispatch_Post
SET isSync = 1
WHERE ChallanNo 
IN (SELECT TOP 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY 
CreatedDate DESC)

0

별명과 조인을 사용하여 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.