0

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

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

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

谢谢!

4

2 回答 2

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 的行是您想要的行。

于 2014-02-18T05:52:08.557 回答
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;

一个用于测试的 SQLfiddle

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

此外,在对您的生产数据运行 Internet 上随机人员的 SQL 更新之前,请始终先进行测试 :)

于 2014-02-19T05:23:55.210 回答