如何根据另一个表中的术语标记表中的某些记录?

时间:2015-07-28 19:53:15

标签: sql sql-server

我想使用[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或者甚至是具有一些可重用性的循环来实现这一点的建议吗?我将非常感激。

(下面是我现在和绿色箭头下面的布局和数据示例是我想要的内容)

enter image description here

1 个答案:

答案 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
                  );