![](/img/trans.png)
[英]Filtering Database Results to Top n Records for Each Value in a Lookup Column
[英]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
我需要:
我确实根据右边的数字条写了很多东西,但是由于输入的数量以百万计,而查找表本身以千计,因此性能受到了影响。
高度赞赏任何优化的解决方案或建议。
如果 Acol 被索引,这应该很快:
Select
*
From (
Select Top 1
*
From
Test
Where
Acol <= @Input
Order By
ACol Desc
) a
Where
@Input Like Acol + '%'
我不喜欢 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.