복붙노트

[SQL] SQL의 데이터베이스 테이블에서 모든하지만 상위 N 삭제

SQL

SQL의 데이터베이스 테이블에서 모든하지만 상위 N 삭제

SQL에서 테이블의 모든 행을 삭제할 수 있지만 상단에 행 n 개의 수를 유지하는 가장 좋은 방법은 무엇입니까?

해결법

  1. ==============================

    1.

    DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)
    

    편집하다:

    크리스는 TOP (10) 쿼리가 각 행에 대해 실행 될 수 있기 때문에 좋은 성능 히트납니다. 이 한 시간 일 경우는 거래의 큰대로되지 않을 수도 있습니다,하지만 그것은 일반적인 일이 있으면, 그때 더 가까이에서보고했다.

  2. ==============================

    2.나는 ID 컬럼 (들)은 임시 테이블이나 테이블 변수로 유지하려는 행 세트를 선택합니다. 그런 다음 임시 테이블에 존재하지 않는 모든 행을 삭제합니다. 사용자가 다른 한 구문 :

    나는 ID 컬럼 (들)은 임시 테이블이나 테이블 변수로 유지하려는 행 세트를 선택합니다. 그런 다음 임시 테이블에 존재하지 않는 모든 행을 삭제합니다. 사용자가 다른 한 구문 :

    DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)
    

    잠재적 인 문제를 가지고 있습니다. 은 "SELECT TOP 10"쿼리는 큰 성능 저하 될 수있는 테이블의 각 행에 대해 실행됩니다. 당신은 또 다시 같은 질문을 피하려고.

    이 구문은 원래의 SQL 문으로 나열 무엇을 기반으로 작동합니다 :

    create table #nuke(NukeID int)
    
    insert into #nuke(Nuke) select top 1000 id from article
    
    delete article where not exists (select 1 from nuke where Nukeid = id)
    
    drop table #nuke
    
  3. ==============================

    3.MS SQL을 사용하지 않는 사용의 사람들을 위해 미래 참조.

    MS SQL을 사용하지 않는 사용의 사람들을 위해 미래 참조.

    PostgreSQL을 사용 ORDER BY와 LIMIT 대신 TOP합니다.

    DELETE FROM table
    WHERE id NOT IN (SELECT id FROM table ORDER BY id LIMIT n);
    

    MySQL의 - 잘 ...

    아직 나는 생각하지 않습니다.

  4. ==============================

    4.나는 훨씬 더 인 - 절 또는 임시 테이블보다 것이다 가상 테이블을 사용하여 생각합니다.

    나는 훨씬 더 인 - 절 또는 임시 테이블보다 것이다 가상 테이블을 사용하여 생각합니다.

    DELETE 
        Product
    FROM
        Product
        LEFT OUTER JOIN
        (
            SELECT TOP 10
                Product.id
            FROM
                Product
        ) TopProducts ON Product.id = TopProducts.id
    WHERE
        TopProducts.id IS NULL
    
  5. ==============================

    5.나는 다른 맛을 모르는 그러나 DELETE MySQL은 LIMIT 수 있습니다.

    나는 다른 맛을 모르는 그러나 DELETE MySQL은 LIMIT 수 있습니다.

    당신이 그렇게 유지하려는 n 행이 아래에 있다는 것을 주문할 수 있다면, 당신은 테이블 LIMIT의 tablecount-N에서 DELETE를 할 수 있습니다.

    편집하다

    OOOO. 나는 귀하의 경우에는 작동 가정, 더 나은 코리 포이의 대답처럼 생각합니다. 내 방법은 비교하여 약간 어설픈 느낌.

  6. ==============================

    6.이건 정말 언어 특정 될 것입니다,하지만 난 아마 SQL 서버에 대한 다음과 같은 것을 사용합니다.

    이건 정말 언어 특정 될 것입니다,하지만 난 아마 SQL 서버에 대한 다음과 같은 것을 사용합니다.

    declare @n int
    SET @n = SELECT Count(*) FROM dTABLE;
    DELETE TOP (@n - 10 ) FROM dTable
    

    당신이 행의 정확한 숫자에 대해 걱정하지 않는 경우, 항상있다

    DELETE TOP 90 PERCENT FROM dTABLE;
    
  7. ==============================

    7.여기에 내가했던 방법이다. 이 방법은 빠르고 간단합니다 :

    여기에 내가했던 방법이다. 이 방법은 빠르고 간단합니다 :

    OFFSET 명령을 사용하여 MS SQL에서 데이터베이스 테이블에서 모든하지만 상위 N 삭제

    WITH CTE AS
        (
        SELECT  ID
        FROM    dbo.TableName
        ORDER BY ID DESC
        OFFSET 11 ROWS
        )
    DELETE CTE;
    

    정렬 할하는 열이 ID를 교체합니다. 삭제하려는 행의 수와 OFFSET 후 번호를 교체합니다. 귀하의 경우에 맞는 어떤 - DESC 또는 ASC를 선택합니다.

  8. ==============================

    8.나는 아래의 기술을 사용하여 해결한다. 이 예는 각 행에 ID로 기사 테이블을 기대합니다.

    나는 아래의 기술을 사용하여 해결한다. 이 예는 각 행에 ID로 기사 테이블을 기대합니다.

    Delete article where id not in (select top 1000 id from article)
    

    편집 : 너무 내 자신의 질문에 대답하기 위해 속도를 ...

  9. ==============================

    9.리팩토링?

    리팩토링?

    Delete a From Table a Inner Join (
        Select Top (Select Count(tableID) From Table) - 10) 
            From Table Order By tableID Desc
    ) b On b.tableID = A.tableID
    

    편집 : 쿼리 분석기에서 둘 다 시도, 현재의 대답은 단식한다 (빌어 먹을 순서에 의해 ...)

  10. ==============================

    10.그것은 기존의 테이블과 같은 이름을 가진, 그래서 더 나은 방법은 다른 테이블에 당신이 원하는 마십시오 행을 삽입 원래 테이블을 삭제하고 새 테이블의 이름을 변경하는 것

    그것은 기존의 테이블과 같은 이름을 가진, 그래서 더 나은 방법은 다른 테이블에 당신이 원하는 마십시오 행을 삽입 원래 테이블을 삭제하고 새 테이블의 이름을 변경하는 것

  11. from https://stackoverflow.com/questions/46385/delete-all-but-top-n-from-database-table-in-sql by cc-by-sa and MIT license