【问题标题】:SQL Join based on a pattern基于模式的 SQL 连接
【发布时间】: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


【解决方案1】:

首先,正如 DLeh 所说,@model 不应该用引号引起来。

我不明白为什么要为 @model1 分配不同的值 尽管我是在强迫它

没有为@model分配不同的值

如果您在下面执行查询,您可以看到 PATINDEX 返回 0,然后子字符串从第 0 个索引获取 p.UpdateModel 的完整值到其长度

select g.updatedmodel as GFK,p.updatedmodel Product, PATINDEX(@model1,p.updatedmodel) 
from dbo.tmpModels g
join dbo.tmp_product p
on g.updatedmodel= substring(p.updatedmodel,PATINDEX(@model1,p.updatedmodel),LEN(@model1))

我可以建议的一个解决方案是使用WHERE 条件而不是JOIN

set @model1 = '%wa5714%'

    select DISTINCT g.updatedmodel as GFK,p.updatedmodel Product
    from dbo.tmpModels g
    , dbo.tmp_product p
    WHERE PATINDEX(@model1,p.updatedmodel) > 0
    AND  PATINDEX(@model1,g.updatedmodel) > 0

我假设您的模型应该显示 tmpModel 和 tmp_Product 的值。

如果您有不同的要求,请提供更多详细信息/示例

【讨论】:

  • 非常感谢。这有助于我对我编写的 sql 语句的工作原理有所了解。我主要使用您的解决方案来获得所需的结果。然而,我保存了其他给我错误结果的 sn-ps,我将在这里再次讨论这些 sql 语句。现在,你拯救了我的一天。
猜你喜欢
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 2021-08-23
  • 1970-01-01
  • 2016-11-22
  • 2016-12-02
  • 2011-11-25
相关资源
最近更新 更多