我希望能够:
最终
Word | Count
--------+------
Test | 7
Blue | 5
Have | 2
目前我试过这个:
INSERT INTO final (word, count)
SELECT
extext
, SUM(dbo.WordRepeatedNumTimes(extext, 'test')) AS Count
FROM [dbo].[TestSite_Info], [dbo].[table_words]
WHERE [dbo].[TestSite_Info].ExText = [dbo].[table_words].Words
GROUP BY ExText;
函数dbo.WordRepeatedNumTimes是:
ALTER function [dbo].[WordRepeatedNumTimes]
(@SourceString varchar(8000),@TargetWord varchar(8000))
RETURNS int
AS
BEGIN
DECLARE @NumTimesRepeated int
,@CurrentStringPosition int
,@LengthOfString int
,@PatternStartsAtPosition int
,@LengthOfTargetWord int
,@NewSourceString varchar(8000)
SET @LengthOfTargetWord = len(@TargetWord)
SET @LengthOfString = len(@SourceString)
SET @NumTimesRepeated = 0
SET @CurrentStringPosition = 0
SET @PatternStartsAtPosition = 0
SET @NewSourceString = @SourceString
WHILE len(@NewSourceString) >= @LengthOfTargetWord
BEGIN
SET @PatternStartsAtPosition = CHARINDEX (@TargetWord,@NewSourceString)
IF @PatternStartsAtPosition <> 0
BEGIN
SET @NumTimesRepeated = @NumTimesRepeated + 1
SET @CurrentStringPosition = @CurrentStringPosition + @PatternStartsAtPosition +
@LengthOfTargetWord
SET @NewSourceString = substring(@NewSourceString, @PatternStartsAtPosition +
@LengthOfTargetWord, @LengthOfString)
END
ELSE
BEGIN
SET @NewSourceString = ''
END
END
RETURN @NumTimesRepeated
END
当我运行上述INSERT
语句时,不会插入任何记录。
在表格中, TestSite_Info 是一个名为 Extext 的列。在此列中,有随机文本 - 其中一个词是&#39; test&#39;。
在名为 Table_Words 的另一个表中,我有一个名为 Words 的列,其中一个词是&#39; Test&#39;。所以在理论上,由于这个词是匹配的,我会把它拿起来,把它放到表 Final 中,然后在单词旁边(在另一列中)计算这个单词的次数已在 TestSite_Info.Extext 中找到。
Table_Words
id|word
--+----
1 |Test
2 |Onsite
3 |Here
4 |As
TestSite_Info
ExText
-------------------------------------------------
This is a test, onsite test , test test i am here
预期的最终表已在顶部给出。
- 更新
现在我已经运行了Abecee代码块,这实际上可以用来带回一个计数列和与该单词相关的id。
结果如下:
id|total
--+----
169 |3
170 |0
171 |5
172 |7
173 |1
174 |3
取自以下提取的文字:
测试测试,我去了,这是一个测试,我写垃圾你好 但是我并不关心照顾和照顾,这似乎是你会看到的 四个字以及单词单词单词,但是一个。! 谁知道这里发生了什么。
正如您所看到的,ID 172的计数出现7次(作为参考,请参阅下面的ID与数字相关的内容),这是不正确的,它应该出现6次(其中添加+1为某些原因)以及ID 171这个单词护理,出现4次,但在计数上显示为5次。任何想法为什么会这样? 我真正追求的是一种方式,因为你已经非常友好地完成了显示ID和计数的表,但也在决赛桌中显示了它所涉及的单词,所以我不必通过链接回来ID表,看看实际的单词是什么。
Word|id
--+----
as |174
here |173
word |172
care |171
hello |170
test |169
答案 0 :(得分:0)
根据我的理解,这可能会起到作用。但是,如果您发布架构
,情况会更加清晰create table final(
word varchar(100),
count integer
);
insert into final (word, count)
select column1, count(*)
from table1, table2
where table1.column1 = table2.words
group by column1;
答案 1 :(得分:0)
您可以使用更新的
WITH
Detail AS (
SELECT
W.id
, W.word
, T.extext
, (LEN(REPLACE(T.extext, ' ', ' ')) + 2
- LEN(REPLACE(' '
+ UPPER(REPLACE(REPLACE(REPLACE(REPLACE(T.extext, ' ', ' '), ':', ' '), '.', ' '), ',', ' '))
+ ' ', ' ' + UPPER(W.word) + ' ', '')) - 1
) / (LEN(W.word) + 2) count
FROM Table_Words W
JOIN TestSite_Info T
ON CHARINDEX(UPPER(W.word), UPPER(T.extext)) > 0
)
INSERT INTO Result
SELECT
id
, SUM(count) total
FROM Detail
GROUP BY id
;
(忘了把前面和后面添加的空白计算在内,错过了一个符号变化,并且被空白包围的单词长度混淆了。很抱歉。感谢您测试它比我原来的更彻底!) 在SQL Server 2008上进行了测试:Updated SQL Fiddle和2012:Updated SQL Fiddle 还有with your test case。
有:
请评论是否需要进一步详细说明。
答案 2 :(得分:0)
重新阅读问题描述,呈现的SELECT
似乎尝试对齐/加入完整&#34; exText&#34;单词&#34;单词&#34; - 但基于平等。然后,它有&#34; exText&#34;在SELECT
列表中,&#34;结果&#34;似乎在等待个别的话。 (但这不会使INSERT
失败,只要该字段没有受到外键约束的保护。但由于WHERE
/ JOIN
不太可能让任何数据通过,无论如何,这可能永远不会成为一个问题。)
对于纯声明方法的替代方法,您可能希望尝试
INSERT INTO final (word, count)
SELECT
word
, SUM(dbo.WordRepeatedNumTimes(extext, word)) AS Count
FROM [dbo].[TestSite_Info], [dbo].[table_words]
WHERE CHARINDEX(UPPER([dbo].[table_words].Word), UPPER([dbo].[TestSite_Info].ExText)) > 0
GROUP BY word;
你有&#34; Word&#34;在你的&#34; Table_Words&#34;描述 - 但使用&#34; [dbo]。[table_words]。Words&#34;在WHERE
条件......
答案 3 :(得分:0)
感谢您的帮助。 此解决方案的最佳方法是:
使用 细节AS( 选择 W.id ,W.word ,T.extext ,(LEN(REPLACE(T.extext,'',''))+ 2 - LEN(REPLACE(''' + UPPER(REPLACE(REPLACE(REPLACE(REPLACE(T.extext,'',''),':',''),'。',''),',','')) +'',''+ UPPER(W.word)+'','')) - 1 )/(LEN(W.word)+ 2)计数 FROM Table_Words W 加入TestSite_Info T. ON CHARINDEX(UPPER(W.word),UPPER(T.extext))&gt; 0 ) 插入结果 选择 ID ,SUM(计数)总计 从细节 GROUP BY id