1

以下に示すように、テーブルに列(A-COL)があります。A-COLには、それぞれ最大25桁のさまざまな組み合わせがあります。

A-COL      B-COL  
018         xxx  
01812       xxx    
0199        xxx  
019232      xxx    
00452       xxx    
00323       xxx    
00651       xxx    
019287      xxx    
*121        xxx    
N22321      xxx    
XN43155     xxx    

する必要がある:

  1. この列(A-COL)を検索して、最も一致する行を見つけます。
  2. このテーブルの対応する列(B-COL)をフェッチします。
  3. これを単一の値としてSQLに入力します。たとえば、0181233445は01812、2行目に一致し、同様に、00323455387は6行目に一致し、N22321は10行目に一致します。

私は右からの数字のストリップに基づいてたくさん書いたが、入力の数が数百万であり、ルックアップテーブル自体が数千であるため、パフォーマンスに打撃を与えている。

最適化されたソリューションや提案は大歓迎です。

4

2 に答える 2

2

Acol がインデックス化されている場合、これは高速です。

Select
  *
From (
  Select Top 1
    *
  From 
    Test
  Where 
    Acol <= @Input
  Order By 
    ACol Desc
  ) a
Where
  @Input Like Acol + '%'

http://sqlfiddle.com/#!3/910b3/1

于 2012-11-12T22:49:06.567 に答える
0

SQL のループは好きではありませんが、A-Col にインデックスがあり、テーブルがかなり長い場合は、おそらくこれが最も効率的な方法です。

declare @n int
set @n = datalength(@SearchText)
while @n>0 and @aCol is null begin
  select @acol = [A-Col] from table where substring(@SearchText,1,@n)=[A-Col]
  set @n = @n - 1
end
select @acol

A-Col がインデックス化されていない場合、これでうまくいくはずです (ただし遅いです):

select top 1 ACol
from table 
where @Searchtext like ACol+'%' 
order by DataLength(ACol) desc

注: 未テスト。

更新: 最初のアプローチを実装した可能性が高いと読みました。

アイデア: たとえば、何百万もの入力テーブルが「入力」と呼ばれているとしましょう。一致する列は「数値」と呼ばれます。次に、列「番号」にインデックスを付けて、これを行います

WITH cte AS (
  select input.number, 
         lookup.ACOL, 
         ROW_NUMBER() OVER (
           PARTITION BY input.number, lookup.ACOL 
           ORDER BY DataLength(lookup.ACOL)
           ) as rowNumber
  from   input 
         join lookup on lookup.ACOL like input.number+'%'
)
SELECT *
FROM cte
WHERE rowNumber = 1
于 2012-11-12T22:18:14.160 に答える