database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 7456 게시물 읽기
No. 7456
높은순서대로 record 삭제하는 방법?
작성자
help
작성일
2008-07-06 08:54
조회수
6,129

안녕하세요.

지금 table에

score: int
name: name

이렇게 두개의 컬럼이 있습니다. 제가 하고 싶은것은 score가 높은 순서대로 10명의 레코드를 삭제하는 것입니다. 이것을 할 수 있는 방법이 있을까요?

감사합니다.

이 글에 대한 댓글이 총 6건 있습니다.

DELETE FROM a WHERE score IN (

SELECT score FROM a ORDER BY score DESC LIMIT 10

);

홍민희(dahlia)님이 2008-07-06 12:25에 작성한 댓글입니다.
이 댓글은 2008-07-06 12:25에 마지막으로 수정되었습니다.

위의 홍민희 님께서 써주신 방법은 안될 것 같습니다. 왜냐하면, score들 간에 동률이 있거든요. 다른 방법은 없을까요?

help님이 2008-07-06 14:13에 작성한 댓글입니다. Edit

동률인 1등 11명이 있으면 이 사람이 모두 삭제되어야 하나요 아니면 이 중 10명만 되어야 하나요?

신기배(소타)님이 2008-07-06 14:24에 작성한 댓글입니다.

10명만 삭제되어야 해요. 즉, 


select * from a order by score DESC LIMIT 10


을 했을떼 리턴되는 로우들을 지우고 싶습니다.

help님이 2008-07-07 00:13에 작성한 댓글입니다. Edit

만약 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를 추가하시는 것이 좋을 듯 싶습니다.

박성철(gyumee)님이 2008-07-07 02:10에 작성한 댓글입니다.
이 댓글은 2008-07-07 11:21에 마지막으로 수정되었습니다.

음 주키도 없는 테이블에서 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 함수는 활용 빈도가 높기 때문에 일반 쿼리에서 쓸 수 있도록 저장프로시저로 포장해 놓는 것도 좋습니다.

초보대왕님이 2008-07-07 21:53에 작성한 댓글입니다.
이 댓글은 2008-07-07 21:55에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
7460컬럼 코멘트 가져오기 [3]
김주미
2008-07-08
7118
7459(VC++) Ado postgresql 사용법(문의) [2]
임지웅
2008-07-07
6533
7457대량의 레코드를 copy할때 자동으로 id(serial) 증가 방법? [7]
help
2008-07-06
7076
7456높은순서대로 record 삭제하는 방법? [6]
help
2008-07-06
6129
7455ADO POSTGRES ODBC 사용법 [2]
임지웅
2008-07-04
6643
7454솔라리스에서 createdb 오류...???? [1]
직한
2008-07-04
6444
7453테이블컬럼 구분자 주로 char또느 integer 어떤것들을 쓰는게 좋나요? [3]
장병찬
2008-07-02
6576
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다