【发布时间】:2015-01-13 21:01:40
【问题描述】:
我有两个表 tmpModels 和 tmp_product。需要根据 tmpModel 中的模型找到匹配的模型。
例如,如果 tmpmodel.updatedmodel ='amb3771' 和 tmp_product.updatedmodel 可能是 'amb3771bian' or '123abc3771xv',那么我们就有了匹配项。
这意味着 tmp_product.updatedmodel 应该在 updatedmodel 列的任何位置包含来自 tmpmodel 的匹配模式。
我实际上已经创建了一个存储过程,但这里是一个 sn-p 检查一个特定值的行为。
declare @model1 nvarchar(255)
set @model1 = 'amb3771'
select g.updatedmodel as GFK,p.updatedmodel Product from dbo.tmpModels g
join dbo.tmp_product p
on g.updatedmodel= substring(p.updatedmodel,PATINDEX('%@model1%',p.updatedmodel),LEN(@model1))
select @model1
我希望结果中只显示两行。我不明白为什么将不同的值分配给@model1,即使我强制它为“amb3771”,奇怪的是没有匹配“amb3771”的结果!!请帮助我理解为什么这个逻辑不起作用并给出预期的结果。下面是结果-
GFK Product
w679 w679
t754cw t754cw
wa5714 wa5714silber
fl2823 fl2823
dc7230 dc7230
wda100 wda100
wa74sd wa74sd
ev9547 ev9547
wa5714 wa5714weiss
wa7439 wa7439
wda210 wda210wpm
wda210 wda210wpm
w194 w194
wda110 wda110wcs
wa5714 wa5714silber
wda100 wda100
【问题讨论】:
-
PATINDEX('%@model1%'- 为什么@model1包裹在 's 中? -
呃。对于您显示的查询,您正在对 tmpModels 进行完整的表扫描。然后,对于该表中的每一行,您正在对 tmp_product 进行完整的表扫描。对于预期的两行结果,这可能是非常多的表扫描。即使您过滤了 tmpModels 行,也无法使连接条件成为 sargable。您最好的长期策略是在“amb3771”和“xxxamb3771xxx”之间建立一个简单的连接器。除了嵌入的字符串之外,必须有一些东西可以将第二个连接到第一个。如果某些内容尚不存在,请创建它。
-
@DLeh,谢谢!哦,引号。我没听懂,一直担心他的逻辑。
-
@TommCatt 我们正在尝试将来自两个不同来源的相似数据汇集在一起,然后以某种方式将它们映射到一个结构。这项调查是为了了解这两个来源之间模型名称的数据和相似性。我一定会检查是否有任何东西可以用作连接器。 tmp_product(1500 行) 相对小于 tmpmodels(400,000 行)。当然,表格正在增长,这将在未来发生变化。感谢您的建议。
标签: sql join pattern-matching