programing

SQL Server 2008을 사용하여 테이블에서 상위 1000개 행을 삭제하는 방법은 무엇입니까?

kakaobank 2023. 5. 17. 23:19
반응형

SQL Server 2008을 사용하여 테이블에서 상위 1000개 행을 삭제하는 방법은 무엇입니까?

SQL Server에 테이블이 있습니다.상위 1000개 행을 삭제하고 싶습니다.하지만, 저는 이것을 시도했지만, 상위 1000개 행을 삭제하는 대신 테이블의 모든 행을 삭제했습니다.

코드는 다음과 같습니다.

delete from [mytab] 
select top 1000 
a1,a2,a3
from [mytab]

당신이 시도한 코드는 사실 두 개의 문장입니다.aDELETE다음에SELECT.

정의하지 않았습니다.TOP무엇이 명하는 대로

특정 주문 기준의 경우 CTE 또는 유사한 표 식에서 삭제하는 것이 가장 효율적인 방법입니다.

;WITH CTE AS
(
SELECT TOP 1000 *
FROM [mytab]
ORDER BY a1
)
DELETE FROM CTE

sql2005+에서 다음을 사용하는 것이 더 나을 수 있습니다.

DELETE TOP (1000)
FROM [MyTab]
WHERE YourConditions

Sql2000의 경우:

DELETE FROM [MyTab]
WHERE YourIdField IN 
(
  SELECT TOP 1000 
    YourIdField 
  FROM [MyTab]
  WHERE YourConditions
)

그렇지만

임의의 부분 집합 대신 특정 행의 부분 집합을 삭제하려면 하위 쿼리 순서를 명시적으로 지정해야 합니다.

DELETE FROM [MyTab]
WHERE YourIdField IN 
(
  SELECT TOP 1000 
    YourIdField 
  FROM [MyTab]
  WHERE YourConditions
  ORDER BY ExplicitSortOrder
)

tp @gbn에서 더 명확하고 정확한 답변을 요청해 주셔서 감사합니다.

아래 링크에 정의된 대로 직접 삭제할 수 있습니다.

USE AdventureWorks2008R2;
GO
DELETE TOP (20) 
FROM Purchasing.PurchaseOrderDetail
WHERE DueDate < '20020701';
GO

http://technet.microsoft.com/en-us/library/ms175486(v=sql.105).aspx

delete from [mytab]
where [mytab].primarykeyid in
(
select top 1000 primarykeyid
from [mytab]
)
SET ROWCOUNT 1000;

DELETE FROM [MyTable] WHERE .....

그것은 빠릅니다.사용해 보십시오.

DELETE FROM YourTABLE
FROM (SELECT TOP XX PK FROM YourTABLE) tbl
WHERE YourTABLE.PK = tbl.PK

교체하다YourTABLE테이블 이름,XX숫자로 표시됩니다. 예를 들어 1000,pk테이블의 기본 키 필드 이름입니다.

저는 하메드 엘라히글로리핀델의 의견에 동의합니다.

추가할 제안은 별칭을 사용하여 삭제하고 업데이트할 수 있습니다.

/* 
  given a table bi_customer_actions
  with a field bca_delete_flag of tinyint or bit
    and a field bca_add_date of datetime

  note: the *if 1=1* structure allows me to fold them and turn them on and off
 */
declare
        @Nrows int = 1000

if 1=1 /* testing the inner select */
begin
  select top (@Nrows) * 
    from bi_customer_actions
    where bca_delete_flag = 1
    order by bca_add_date
end

if 1=1 /* delete or update or select */
begin
  --select bca.*
  --update bca  set bca_delete_flag = 0
  delete bca
    from (
      select top (@Nrows) * 
        from bi_customer_actions
        where bca_delete_flag = 1
        order by bca_add_date
    ) as bca
end 

승인된 응답 코드를 향상시키려면 내 코드를 확인하십시오.코드는 테이블에서 한 번에 1000개의 행을 삭제하는 것으로 시작한 다음 각 반복 후 배치 크기를 10% 늘립니다.이렇게 하면 테이블이 작아질수록 코드가 더 많은 행을 삭제하고 필요한 루프 수를 줄일 수 있습니다.@count 변수는 여전히 각 delete 문의 영향을 받는 행 수를 저장하고 루프가 0이 되면 중지됩니다.

DECLARE @batch_size INT = 10000
DECLARE @count INT = 1
WHILE @count > 0
BEGIN
    ;WITH CTE AS
    (
    SELECT TOP (@batch_size) *
    FROM [mytab]
    ORDER BY a1
    )
    DELETE FROM CTE

    SET @count = @@ROWCOUNT

    -- Increase the batch size by 10% after each iteration
    SET @batch_size = @batch_size * 1.1
END

언급URL : https://stackoverflow.com/questions/8955897/how-to-delete-the-top-1000-rows-from-a-table-using-sql-server-2008

반응형