在文本中查找匹配的关键字(用于解析链接)

时间:2014-07-15 11:18:27

标签: sql-server parsing text match keyword

“这是我的第一个问题,所以如果在提问时有任何错误,请先抱歉。”

  

TableA (有200k行)

     
     

ID 文字关键字
  101 24hourdelivery NULL
  102 carracing NULL
  103个dailynews NULL
  比分104 NULL
  105 worldcup NULL

-

  

TableB (有400k行)

     
     

ID 长度关键字
  101个4小时
  102个8输送
  103个3车
  104个6赛车
  105个5每日
  106个4新闻
  107个4活
  108个6分数
  109 5世界
  110 3杯

-

我将每天运行一次sql并在TableA中更新关键字 TableA中每天会有不同 200k行 它看起来像那样(关键字按长度排序):

  

TableA

     
     

ID 文字关键字
  101 24hourdelivery#输送#小时#24#
  102 carracing#赛车#车#
  103 dailynews#每日新闻###新
  104#比分比分#得分#住#
  105 worldcup#world#cup#


我尝试使用 MERGE

MERGE INTO TableA As T  
USING (SELECT keywords FROM TABLEB order by length desc) As S  
ON CHARINDEX(S.keywords,T.text)>0
WHEN MATCHED THEN
UPDATE SET keywords=keywords+'#'+S.keywords;  

1 - 有一个错误,我无法使用订单与MERGE(我更换)
2- “MERGE语句试图多次更新同一行..”


任何解决方案?
谢谢,

1 个答案:

答案 0 :(得分:0)

这里的问题是MERGE没有,正如它所说的那样,让你在同一次执行期间两次改变同一条记录。因此,您无法更新记录以反映查找匹配项,然后再次执行此操作。要做到你所要求的,我最好的建议就像光标一样,但这会非常慢。

在不知道您希望对数据实际执行的操作的详细信息的情况下,我首先建议您将当前以hashtag分隔的数据拉出到单独的表中,甚至是视图中。同样,我不知道你在做什么,所以这可能是错的。但在大多数情况下,这就是我的建议。特别是因为你所谈论的数据每天都在变化。在大多数情况下,这将是最轻的开销,并且它将更容易使用。

如果您采用这种方法,可以使用类似

的方式定义您的视图
SELECT TableA.*, TableB.Id AS BId, TableB.Keywords AS Keywords
FROM TableA
INNER JOIN TableB ON (TableA.Text LIKE '%' + TableB.Keywords + '%')

您刚刚在评论中告诉我,您实际上每天要添加另外200,000条记录。我最初误解了这一点。鉴于此,这可能不会特别快。

但是,我仍会投资一张单独的牌桌。同样,在不知道您希望实现的具体细节的情况下,这似乎更容易。您可以在导入数据时运行以下语句:

INSERT INTO [TableName] (AId, BId)
SELECT TableA.Id, TableB.Id
FROM TableA
INNER JOIN TableB ON (TableA.Text LIKE '%' + TableB.Keywords + '%')

同样,这似乎更容易操作,特别是因为您不必解析主题标签符号以读取存在的关键字,甚至有多少关键字。如果您愿意,也可以使用MERGE,而不是INSERT。您甚至可以使用WHEN NOT MATCHED BY SOURCE并保持其正确同步。如果这是有益的,你可以使用触发器。

做这样的表或视图之间的选择实际上只是性能要求的问题,在某些情况下每个都会更好。

如果您不想采用这种方法,我会改变这个答案,因为我知道这并不能严格回答您实际发布的问题。但我正在采取一些不同的方向并提出这个建议。