繁体   English   中英

在数据库列中查找和匹配

[英]Lookup and match in database column

我在下表中有一个列 (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,第二行,类似地,00323455387将匹配第6行,而N22321将匹配第10行。

我确实根据右边的数字条写了很多东西,但是由于输入的数量以百万计,而查找表本身以千计,因此性能受到了影响。

高度赞赏任何优化的解决方案或建议。

如果 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

我不喜欢 SQL 中的循环,但这可能是最有效的方法 if(!) 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM