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。
如何更新主表以使用最佳匹配从描述表中提取代码,而不仅仅是第一个匹配的实例?
谢谢!
答案 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;
请注意,(可能)不可能像这样(或您的原始查询)使用CHARINDEX
查询使用索引,因此查询对于大量数据可能非常慢。
此外,在生产数据上从Internet上的随机用户运行SQL更新之前,请始终先测试:)