안녕하세요.
지금 table에
score: int name: name
이렇게 두개의 컬럼이 있습니다. 제가 하고 싶은것은 score가 높은 순서대로 10명의 레코드를 삭제하는 것입니다. 이것을 할 수 있는 방법이 있을까요?
감사합니다.
DELETE FROM a WHERE score IN (
SELECT score FROM a ORDER BY score DESC LIMIT 10
);
위의 홍민희 님께서 써주신 방법은 안될 것 같습니다. 왜냐하면, score들 간에 동률이 있거든요. 다른 방법은 없을까요?
동률인 1등 11명이 있으면 이 사람이 모두 삭제되어야 하나요 아니면 이 중 10명만 되어야 하나요?
10명만 삭제되어야 해요. 즉,
select * from a order by score DESC LIMIT 10
을 했을떼 리턴되는 로우들을 지우고 싶습니다.
만약 PK가 따로 있다면
DELETE FROM a WHERE PK IN ( SELECT PK FROM a ORDER BY score DESC LIMIT 10);
이 되겠지만 아마도 이런 질문을 하신 것을 보니 PK가 없나보네요.
OID도 안 쓰실 것 같고...
결국 score, name의 조합이 unique 하다고 기대하는 수 밖에 없을 듯 합니다.
이 경우
delete from a as a1 using (select score, name from a order by score desc, name limit 10) as a2 where a1.score=a2.score and a1.name=a2.name;
이런 식으로 처리하시면 됩니다.
uniquey key가 전혀 없다면 10번째 이후를 temporary table에 복사한 후에 테이블을 다 지우고 다시 복사했던 자료를 가지고 오는 방법 말고는 생각이 안 나네요.
하지만 PK 없는 테이블은 좋은 설계가 아니니 지금이라도 PK를 추가하시는 것이 좋을 듯 싶습니다.
음 주키도 없는 테이블에서 score 순서대로 10 개를 삭제하는 듯 한데,이 경우는 쉬울 수도, 어려울 수도 있읍니다.단순 일반 쿼리로는 물론 어렵습니다. 그런데 PGSQL 의 확장 서버함수(SPI)를 사용하면이 정도는 암것도 아닙니다. 너무 쉬운 문제입니다.!SPI 중에서 SPI_execute 를 사용하면 됩니다 SPI_execute("DELETE FROM a WHERE score IN (SELECT score FROM a ORDER BY score DESC LIMIT 10", false, 10); 그리고 SPI_execute 함수는 활용 빈도가 높기 때문에 일반 쿼리에서 쓸 수 있도록 저장프로시저로 포장해 놓는 것도 좋습니다.
SPI 중에서 SPI_execute 를 사용하면 됩니다 SPI_execute("DELETE FROM a WHERE score IN (SELECT score FROM a ORDER BY score DESC LIMIT 10", false, 10); 그리고 SPI_execute 함수는 활용 빈도가 높기 때문에 일반 쿼리에서 쓸 수 있도록 저장프로시저로 포장해 놓는 것도 좋습니다.
", false, 10); 그리고 SPI_execute 함수는 활용 빈도가 높기 때문에 일반 쿼리에서 쓸 수 있도록 저장프로시저로 포장해 놓는 것도 좋습니다.