2009-08-17 55 views
1

我有以下SQL查询,到目前为止它的工作方式应该是,并获得我已经存储在tagmap表中的前40个标记id。如何将此sql查询加入到另一个表中?

SELECT TOP 40 
tbrm_TagMap.TagID, 
Count(*) 
FROM tbrm_TagMap 
GROUP BY tbrm_TagMap.TagID 
ORDER BY COUNT(tbrm_TagMap.TagID) DESC 

我也想加入包含每个TagID的实际名称的标签表。我做的每一次尝试都会返回一个错误。我怎样才能做到这一点?我使用SQL 2008

+0

,如果你说你正在哪个错误这将是有益的。 – APC 2009-08-17 12:12:43

回答

5
SELECT * 
FROM (
     SELECT TOP 40 
       tbrm_TagMap.TagID, COUNT(*) AS cnt 
     FROM tbrm_TagMap 
     GROUP BY 
       tbrm_TagMap.TagID 
     ORDER BY 
       COUNT(*) DESC 
     ) q 
JOIN Tags 
ON  Tags.id = q.TagID 
ORDER BY 
     cnt DESC 
+0

以后加入而不是使用单个加入的好处是什么? – 2009-08-17 12:12:21

+0

@Raj:根据结果集可能会更快。 – Eric 2009-08-17 12:31:20

+1

'@ Raj':避免在'Tags'中对所有字段进行分组。 – Quassnoi 2009-08-17 12:34:54

1

我的猜测是,当你加入tags,你不将它group by子句中,这将始终贯穿在SQL Server错误。每列不汇总但返回需要在group by

尝试这样:

SELECT TOP 40 
    tbrm_TagMap.TagID, 
    t.Tag, 
    Count(*) 
FROM 
    tbrm_TagMap 
    INNER JOIN tags t ON 
     tbrm_TagMap.TagID = t.TagID 
GROUP BY 
    tbrm_TagMap.TagID, 
    t.Tag 
ORDER BY 3 DESC 
+0

@Eric:为什么ORDER BY 3而不是按COUNT(*)排序?将列添加到查询时不会导致问题吗? – 2009-08-17 12:50:51

+0

'按次数(*)排序'可能会再次开始计数。最好只按已经计算的列进行排序。是的,如果你添加列,它确实会搞砸了。更好的解决方案是将'count'命名为某个东西,然后按顺序排列。 – Eric 2009-08-17 12:53:18

1
SELECT TOP 40 
tbrm_TagMap.TagID, Tags.TagName Count(*) 
FROM tbrm_TagMap INNER JOIN Tags ON tbrm_TagMap.TagID = Tags.TagID 
GROUP BY tbrm_TagMap.TagID, Tags.TagName 
ORDER BY COUNT(tbrm_TagMap.TagID) DESC 
+1

这会中断。 'Tags.TagName'需要进入SQL Server中的'group by'子句。 – Eric 2009-08-17 12:09:41

+0

好的,谢谢。 – 2009-08-17 12:10:49

1

试试这个..

SELECT top 40 tags.TagDescription, tbrm_TagMap.TagID, Count(*) 
FROM tbrm_TagMap 
    INNER JOIN Tags 
     ON TagMap.TagID = Tags.TagId 
GROUP BY tags.TagDescription, tbrm_TagMap.TagID 
ORDER BY COUNT(tbrm_TagMap.TagID) DESC 
相关问题