[sql] SQL의 데이터베이스 테이블에서 상위 n 개를 제외한 모두 삭제

SQL의 테이블에서 모든 행을 삭제하고 n 개의 행을 맨 위에 유지하는 가장 좋은 방법은 무엇입니까?



답변

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

편집하다:

Chris는 각 행에 대해 TOP 10 쿼리가 실행되기 때문에 좋은 성능 저하를 가져옵니다. 일회성이라면 그렇게 크지 않을 수도 있지만, 일반적인 일이라면 자세히 살펴 보았습니다.


답변

임시 테이블 또는 테이블 변수에 보관하려는 행 집합의 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


답변

MS SQL을 사용하지 않는 사용자를위한 향후 참조.

PostgreSQL의에서 사용 ORDER BY하고 LIMIT대신 TOP.

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

MySQL-음 …

오류 -이 버전의 MySQL은 아직 ‘LIMIT & IN / ALL / ANY / SOME 하위 쿼리’를 지원하지 않습니다.

아직은 아닌 것 같아요.


답변

가상 테이블을 사용하는 것이 IN 절 또는 임시 테이블보다 훨씬 낫다고 생각합니다.

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


답변

다른 맛에 대해서는 모르지만 MySQL DELETE 는 LIMIT를 허용합니다.

유지하려는 n 행이 맨 아래에 오도록 주문할 수 있다면 DELETE FROM table LIMIT tablecount-n을 수행 할 수 있습니다.

편집하다

Oooo. 나는 Cory Foy의 대답이 귀하의 경우에 효과가 있다고 가정하면 더 좋아한다고 생각합니다. 내 방식은 비교해 보면 약간 투박하다.


답변

이것은 실제로 언어별로 다르지만 SQL 서버에 대해 다음과 같은 것을 사용할 것입니다.

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

정확한 행 수에 신경 쓰지 않으면 항상

DELETE TOP 90 PERCENT FROM dTABLE;


답변

내가 한 방법은 다음과 같습니다. 이 방법은 더 빠르고 간단합니다.

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-귀하의 경우에 적합한 것을 선택하십시오 .