2009-08-17 122 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 
相關問題