SQL Server:如何比较两个表

SQL Server:如何比较两个表,sql,sql-server,Sql,Sql Server,我在比较SQL Server中的两个表时遇到问题 我有第一个表[Table1],其中有文本列,我在其中存储我的内容;第二个表[table2]中有我的关键字列 现在我想将我所有的关键字与我的内容进行比较,得到一个关键字列表,其中包含内容中出现的次数。(足够清楚吗?这将返回表1中的id列表(id int,txt ntext)以及表2中存在于ntext字段中的关键字woard(kwd nvarchar(255))。出现的次数很棘手,您必须编写UDF,最好是CLR one,才能获得它 我将单词定义为所有

我在比较SQL Server中的两个表时遇到问题

我有第一个表
[Table1]
,其中有文本列,我在其中存储我的内容;第二个表
[table2]
中有我的关键字列


现在我想将我所有的关键字与我的内容进行比较,得到一个关键字列表,其中包含内容中出现的次数。(足够清楚吗?

这将返回表1中的id列表(id int,txt ntext)以及表2中存在于ntext字段中的关键字woard(kwd nvarchar(255))。出现的次数很棘手,您必须编写UDF,最好是CLR one,才能获得它

我将单词定义为所有由空格或左括号和空格、右括号、逗号、点或分号分隔的单词。您可以添加更多条件,例如引号、双引号等

Select Table1.id, Table2.kwd 
  From Table1
 Cross Join Table2 
 Where patindex(N'%[ (]'+Table2.kwd+N'[ ,.;)]%',N' '+cast(Table1.txt as nvarchar(max))+N' ')>0
Order by id, kwd

什么版本的SQL Server?如果是SQL2008,您可以这样做(可能是在从文本转换为
nvarchar(max)
之后)

返回

id          display_term                   Cnt
----------- ------------------------------ -----------
3           lorry                          2
3           yellow                         1
4           brown                          1
1           brown                          1

启用全文搜索?首先,如果您使用的是SQL Server 2005和更高版本,请删除文本列并改用VARCHAR(MAX)(或NVARCHAR(MAX))。关键字存储在NAVCHAR(255)列中,但内容存储在ntext中,我无法更改。我只运行一次查询-我们的搜索引擎优化人员需要这些数据。表2是每个关键字包含一行,还是关键字在一个字段内(分隔)?如果您发布一些示例数据,并且预期的结果setKeywords是一行一行的,这将有所帮助。我只想检查每个关键字(短语),如果它在Table2内容列中,如果是的话-有多少次。以及如何获取每个关键字的出现次数?这正在扼杀我的数据库-前10个执行时间达到9分钟:)您写道:“我将word定义为由空格或左括号和空格分隔的所有内容”,但是,每个关键字都是表2中的一行,这是一个繁重的查询,因为它必须在关键字和文本表之间进行交叉连接,并且必须执行patindex函数,这不是速度的冠军。当我说“我将word定义为。。。“我的意思是如何在您的ntext字段中定义单词,因为我不知道单词是以空格分隔、逗号分隔、制表符分隔的,还是按打印文本中单词的常规含义来定义的,而打印文本中可能有分隔符的组合。”。无论如何,如果您有Martin Smith(以下)提出的SQL 2008使用解决方案,尽管它也会占用大量资源。哇,我错过了sys.dm_fts_解析器函数,这是非常感谢的,但我无法运行它。我得到:“参数数据类型ntext对于replace”函数的参数1无效。将
cast(YourColumnName as nvarchar(max))
传递到replace函数。再次感谢。现在它工作了,但结果远远超出我的预期。现在它将我的内容分解为单个单词,但在我的关键字列表中,我还有短语(2字及以上)我想知道每个关键词在内容中出现的次数。也许你应该在问题中提到,你有关键短语,而不是关键词!我没有尝试过这一点,但是
sys.dm_fts_解析器
允许你引用一个同义词库-也许你可以创建一个自定义同义词库,将你的所有短语映射到单个单词ord版本(例如,用空字符串替换所有空格)。如果失败,您可能可以使用
行号()
和解析器函数返回的出现列执行操作。
id          display_term                   Cnt
----------- ------------------------------ -----------
3           lorry                          2
3           yellow                         1
4           brown                          1
1           brown                          1