0

単一の値だけでなく、テーブル内の列に対して最長一致のプレフィックスを実行する必要があります。単一の値には、のようなものを使用しますSELECT value, prefix as lmp FROM aTable WHERE SUBSTRING(value,1, LENGTH(prefix)) = prefix ORDER BY prefix DESC limit 1

問題は、多くのレコードに対して実行されている場合、テーブルスキャンを実行し、値を1つずつ取得する必要があり、クライアントとサーバー間で大量のトラフィックが発生することです。

サブクエリを含むがストアドプロシージャを含まない単一のクエリでそれを行う方法はありますか?PostgreSQL8.4を使用しています。

4

1 に答える 1

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

これにより、ループが完全にサーバーに移動します。これは少し高速になるはずです。

于 2013-03-05T16:03:55.720 に答える