SQL Server从另一个表中的一个表中选择Top记录

时间:2016-07-27 00:13:25

标签: sql-server

我有一张包含数千个关键字的表格。我想隔离该表中排名前25位的否定关键字,然后从这些顶级关键字创建一个联接,以查找与另一个表中的关键字相关联的句子。最终结果将是id_filesentence_idsentimentsentencetoken。两个表都有令牌。

令牌表(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个否定关键字来隔离句子。

这有效,但我只是想知道是否可以在一个存储过程中完成。

1 个答案:

答案 0 :(得分:0)

这是使用SELECT TOPINNER 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