2010-02-09 9 views
0

다음과 같은 문제점이 있습니다. 내 테이블이 너무 큽니다 (수백만 개의 데이터 행), 이는 처리하는 임시 데이터입니다. 나는 어떤 기준에 부합하는 하나의 열의 최대 값과 최소값을 선택하고,이 정보를 처리하고 같은 기준에 따라 데이터를 제거해야한다.PostgreSQL에서 데이터 삭제 및 반환

select max(col), min(col) from _TABLE_ where _CONDITION_; 
... 
delete from _TABLE_ where _CONDITION_; 

테이블이 큰, 나는 그것을 처리 할 때, 사이클에서 그 방법을 quering, 그것은 시간이 좀 걸립니다 : 사실처럼 간단한 구현 보인다. 나는

처럼, 내가 삭제에서 "반환"사용하여 최적화 할 수 있습니다 생각
delete from _TABLE_ where _CONDITION_ returning max(col), min(col); 

그것은 절대적으로 내가 필요한 것,하지만 ... 내가이 집계 함수를 사용할 수 없다는 이야기 :) 전혀 작동하지 않습니다 return 절에서 ...

두 개의 쿼리 (데이터의 최대/최소 선택 및 동일한 데이터 삭제)를 개선하여 쿼리 하나를 대신 작성하는 좋은 방법은 무엇입니까? 어떤 속임수?

어떤 정보가 사전에 감사합니다, Maxym

+0

이 _CONDITIONS_ 상호 배타적와 상대적으로 낮은 번호? – cope360

+0

죄송합니다. 무엇을 의미합니까? 사실 "col".. hm, 사실 저는 포인트 (위도와 경도)의 좌표를 나타내는 두 개의 컬럼을 가지고 있습니다. 그래서 어떤 직사각형에 따라 테이블에서 모든 포인트를 지우도록 선택 합니다만, 최소/최대가 무엇인지 알아야합니다. 삭제 된 포인트의 경도와 경도 (실제, 왜냐하면 대략 내가 직사각형을 가질 수 있기 때문에 :) – Maxym

답변

1

사용과 같은 기능 :

create temporary table test (value int); 
insert into test select generate_series(1,100); 

create or replace function delete_even_from_test_and_return_min_deleted() 
    returns int as 
$$ 
declare 
    _value record; 
    min int; 
begin 
    min=X'7FFFFFFF'; -- INT_MAX 
    for _value in 
    delete from test where value%2=0 returning value 
    loop 
    if min>_value.value then 
     min=_value.value; 
    end if; 
    end loop; 
    return min; 
end; 
$$ language plpgsql; 

select count(*) from test; 
100 

select delete_even_from_test_and_return_min_deleted(); 
2 

select count(*) from test; 
50 
+0

고맙다. 나는 월간을 시도 할 것이다 – Maxym

7

당신은 할 수 있습니다 :

with foo as(delete from table where _CONDITION_ returning col) 
select max(col), min(col) from foo 
+1

9.1에서 왜? 아이디어는 CTE 기능을 사용하는 것입니다. 맞습니까? 예를 들어 8.4에서도 활성화되었습니다. – Maxym

+0

네, 맞습니다. 나는 당신이 (...) DELETE/INSERT를 9.1 이전에 할 수 없다고 생각한다 : http://www.postgresql.org/docs/9.1/static/queries-with.html. 나는 단지 물건을 섞었다, 고마워! –