2013-03-05 2 views
0

단일 값이 아닌 테이블의 열에 대해 가장 긴 일치 접두사를 실행해야합니다. 단일 값의 경우 SELECT value, prefix as lmp FROM aTable WHERE SUBSTRING(value,1, LENGTH(prefix)) = prefix ORDER BY prefix DESC limit 1과 같은 것을 사용합니다.테이블 열에 대해 가장 긴 일치 접두사를 실행하는 가장 좋은 방법은 무엇입니까?

많은 레코드에 대해 수행되는 경우 테이블 스캔을 수행하고 값을 하나씩 가져오고 클라이언트와 서버간에 많은 트래픽이 발생하는 문제가 있습니다.

서브 쿼리는 포함하지만 저장 프로 시저는 포함하지 않는 단일 쿼리에서이를 수행하는 방법이 있습니까? PostgreSQL 8.4를 사용하고 있습니다.

답변

1

당신은 CTE를 사용하여 테이블의 값을 넣어 수행 할 수 있습니다

with list as (
    select 'abc' as prefix union all 
    . . . 
) 
select value, lmp 
from (SELECT value, prefix as lmp, 
      row_number() over (partition by value order by len(prefix) desc) as seqnum 
     FROM aTable join 
      list l 
      on SUBSTRING(value,1, LENGTH(prefix)) = prefix 
    ) t 
where seqnum = 1 

이 조금 더 빨리해야하는 서버에 전적으로 루프를 이동합니다.

관련 문제