我有一张包含数千个关键字的表格。我想隔离该表中排名前25位的否定关键字,然后从这些顶级关键字创建一个联接,以查找与另一个表中的关键字相关联的句子。最终结果将是id_file
,sentence_id
,sentiment
,sentence
,token
。两个表都有令牌。
令牌表(tbl_token
)包含以下列:
id_file, sentence_id, sentiment, token
将前25名与tbl_token
隔离开来的过滤器如下:
id_file = 3, sentiment = 'negative'
句子表(tbl_sentence
)包含以下列:
id_file, sentence_id, sentiment, **sentence**, token
两个表中的sentence_id都有一对多关系,因此对这些关系的连接会拉出句子。顶部查询中的标记存在于tbl_sentence
。
我目前的解决方案是首先从tbl_token
运行前25个与上面相同的过滤器,计算令牌,按降序排序。
SELECT TOP (25)
COUNT(token) AS Count, token
FROM
tbl_token
GROUP BY
token, sentiment, id_file
HAVING
(sentiment = N'negative') AND (id_file = 3)
ORDER BY
COUNT(token) DESC
然后我将其链接到具有sentence_id
的视图中的所有标记。然后,我可以将sentence_id
从视图链接到tbl_sentence
,以根据前25个否定关键字来隔离句子。
这有效,但我只是想知道是否可以在一个存储过程中完成。
答案 0 :(得分:0)
这是使用SELECT TOP
和INNER JOIN
的简单查询。你研究过JOINS吗?另外,你确定你不是指一对多吗?如果令牌出现在多个句子中,那么您将只获得前25个结果,而不是前25个令牌的多个匹配。 ORDER BY
相对重要,因为除非您指定排名顺序,否则TOP 25并不总是处于可预测的顺序。
SELECT TOP 25
ts.id_file,
ts.sentence_id,
ts.sentiment,
ts.sentence,
ts.token
FROM
tbl_token tt
INNER JOIN tbl_sentence ts on ts.sentence_id=tt.sentence_id
WHERE
tt.id_file=3
AND
tt.sentiment='negative'
ORDER BY
tt.SomeFieldToRank25ByDateOrPriority
为一对多编辑!
SELECT
ts.id_file,
ts.sentence_id,
ts.sentiment,
ts.sentence,
ts.token
SentenceCount=COUNT(*)
FROM
(
SELECT TOP 25
tt.sentence_id
FROM
tbl_token tt
WHERE
tt.id_file=3
AND
tt.sentiment='negative'
ORDER BY
tt.SomeFieldToRank25ByDateOrPriority
)AS X
INNER JOIN tbl_sentence ts on ts.sentence_id=x.sentence_id
GROUP BY
ts.id_file,
ts.sentence_id,
ts.sentiment,
ts.sentence,
ts.token