我会在一分钟内解决这个问题(给定时间),但我想提出两个必要条件:
- 任何需要在 SQL 中快速完成的事情都需要基于集合完成。避免“一次一个”地处理事情。
- 使用表值函数将评论拆分为单词对表
- 使用通用表表达式将您的工作分层以保持可读性
使用这三个规则,您可以移动大量数据。在构建了 select 语句之后,只需将其转储到表中即可。
编辑:
CREATE FUNCTION dbo.SplitToPairs(@sText nvarchar(255))
RETURNS @Pairs TABLE (
Pair nvarchar(255) NOT NULL
)
AS
BEGIN
SET @sText = LTRIM(RTRIM(@sText));
DECLARE @Pos1 int = 0
DECLARE @Pos2 int = CHARINDEX(' ', @sText);
DECLARE @Pos3 int;
IF @Pos2 <> 0
BEGIN
DECLARE @Word1 nvarchar(255) = SUBSTRING(@sText, @Pos1+1, @Pos2-@Pos1-1);
WHILE CHARINDEX(N'|' + @Word1 + N'|', N'|the|and|of|to|a|i|it|in|or|is|') <> 0
BEGIN
SET @Pos1 = @Pos2;
SET @Pos3 = CHARINDEX(' ', @sText, @Pos2+1);
SET @Pos2 = @Pos3;
SET @Word1 = SUBSTRING(@sText, @Pos1+1, @Pos2-@Pos1-1);
END
DECLARE @Word2 nvarchar(255);
WHILE @Pos2 <> 0
BEGIN
SET @Pos3 int = CHARINDEX(' ', @sText, @Pos2+1);
IF @Pos3 <> 0
BEGIN
SET @Word2 = SUBSTRING(@sText, @Pos2+1, @Pos3-@Pos2-1);
WHILE CHARINDEX(N'|' + @Word2 + N'|', N'|the|and|of|to|a|i|it|in|or|is|') <> 0
BEGIN
SET @Pos1 = @Pos2;
SET @Pos2 = @Pos3;
SET @Word2 = SUBSTRING(sText, @Pos2+1, @Pos2-@Pos1-1);
END
INSERT @Pairs (Pair) VALUES (@Word1 + N' ' + @Word2)
END
SET @Pos1 = @Pos2;
SET @Pos2 = @Pos3;
SET @Word1 = @Word2;
END
END
-- Note: if only one word in text, no insert happens
RETURN @Pairs
END
然后,使用它来构建一个选择
SELECT I.Source, P.Pair, COUNT(*) AS Frequency
FROM Information AS I CROSS APPLY dbo.SplitToPairs(i.Comment) AS P
GROUP BY I.Source, P.Pair
我可能会因为一些极端情况而离开,但它应该让你知道我要做什么。它也不认为“word1 word2”和“word2 word1”是相等的。
我把它作为练习留给读者:p
编辑:
在线添加TABLE
关键字RETURNS
。
DECLARE
此外,我认为从 SQL 2008 开始的唯一作品中分配一个值..
编辑:
添加RETURN
声明
编辑:
根据 AntarticIce 的反馈进行的更改