我想使用[TagNames]表中相应的TagName更新此[Incoming]表。 [TagNames]表有一个我必须尊重的排名列。如果[TagSearchTerms]表中的SearchTerm在[Incoming]表中的标题中的任何位置找到,那么它就是一个匹配项,它应该立即更新。如果它匹配两个或多个术语,那么编号排名较低的一个获胜(见下图中的第5个记录,下划线的两个词)
我通过一些手工查询完成了这项工作,但我真的想更好地推动它。
这是我的工作(你不能嘲笑我:))
UPDATE Incoming SET TagName = 'Electrical' WHERE title LIKE '%electric%' AND TagName IS NULL OR TagName = '';
UPDATE Incoming SET TagName = 'Electrical' WHERE title LIKE '%faceplate%' AND TagName IS NULL OR TagName = '';
UPDATE Incoming SET TagName = 'Electrical' WHERE title LIKE '%wiring%' AND TagName IS NULL OR TagName = '';
UPDATE Incoming SET TagName = 'Drywall' WHERE title LIKE '%drywall%' AND TagName IS NULL OR TagName = '';
UPDATE Incoming SET TagName = 'Drywall' WHERE title LIKE '%sheetrock%' AND TagName IS NULL OR TagName = '';
正如你所看到的,它非常笨拙地介绍逻辑,并确保不会标记已经具有更高排名值的东西,当然。该代码实际上有效。但是,我需要在更大的范围内执行此操作,这将使其成为数百行/标记,因此需要更多可用。
我假设我需要表驱动这个,所以我创建了这些其他表。如果需要,可以重新设计任何一个,因为我有能力在这个数据库中做到这一点。
任何人都可以给我一些关于如何使用JOIN或者甚至是具有一些可重用性的循环来实现这一点的建议吗?我将非常感激。
(下面是我现在和绿色箭头下面的布局和数据示例是我想要的内容)
答案 0 :(得分:2)
您可以在一个查询中设置代码:
UPDATE Incoming
SET TagName = (CASE WHEN title LIKE '%electric%' OR
title LIKE '%faceplate%' OR
title LIKE '%wiring%'
THEN 'Electrical'
WHEN title LIKE '%drywall%'
title LIKE '%sheetrock%'
THEN 'Drywall'
END);
使用您的表结构,您可以执行以下操作:
UPDATE incoming
SET TagName = (SELECT TOP 1 tst.TagName
FROM TagSearchTerms tst JOIN
TagName tn
ON tst.tagname = tn.tagname
WHERE incoming.title like '%' + tst.searchterm + '%'
ORDER BY tn.rank
);