SQL:我可以使用CHARINDEX返回最佳匹配而不仅仅是第一场比赛吗?

时间:2014-02-18 05:33:33

标签: sql sql-server join sql-update charindex

http://sqlfiddle.com/#!6/5ac78/1

不确定小提琴是否有效。我想从CHARINDEX上的连接返回代码2。

作为另一个例子,我有一个如下所示的描述表(dt):

ID      Description                         Code
158     INTEREST                            199
159     INTEREST PAID                       383
160     INTEREST PAYABLE ON     ACCOUNT     384

包含这样的条目的主表(mt):

ID      Narrative                       Code
1       INTEREST PAID                   NULL

我需要将主表上的代码设置为383.当我使用CHARINDEX(dt.Description,mt.Description)>进行基于JOIN的INSERT时。 0,它每次都将mt.Code设置为199。

如何更新主表以使用最佳匹配从描述表中提取代码,而不仅仅是第一个匹配的实例?

谢谢!

2 个答案:

答案 0 :(得分:1)

这很尴尬,但似乎有效:

update table1 
   set codeA = (
      select max(codeB)
      from table2
      where charindex(colB, colA) > 0
     )
where exists ( 
  select 1 
  from table2
  where charindex(colB, colA) > 0
  );

修改过的小提琴就在这里:http://sqlfiddle.com/#!6/5ac78/12

问题在于知道返回的“最佳”值。我假设具有最大ID的行是您想要的行。

答案 1 :(得分:1)

您可以使用简单的JOIN来查找与LEFT JOIN的匹配,以消除除最长匹配之外的所有匹配;

UPDATE t1 
SET t1.codeA = t2_1.codeB
FROM table1 t1
JOIN table2 t2_1      
  ON CHARINDEX(t2_1.colB, t1.colA) > 0
LEFT JOIN table2 t2_2 
  ON CHARINDEX(t2_2.colB, t1.colA) > 0
 AND t2_1.codeB <> t2_2.codeB 
 AND LEN(t2_2.colB) > LEN(t2_1.colB)
WHERE t2_2.colB IS NULL;

An SQLfiddle to test with

请注意,(可能)不可能像这样(或您的原始查询)使用CHARINDEX查询使用索引,因此查询对于大量数据可能非常慢。

此外,在生产数据上从Internet上的随机用户运行SQL更新之前,请始终先测试:)