2009-08-17 13 views
1

私は以下のSQLクエリを持っています。これまでのところ、タグマップテーブルに格納されている上位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の実際の名前を含むタグテーブルに参加したいと思います。私がしようとする試みのそれぞれは誤りで戻ってくる。どうすればこれを達成できますか?私は私の推測では、あなたがtagsに参加したとき、あなたは、group by句で、それを含めていなかったということであるSQL 2008

+0

あなたが取得しているエラーと述べ場合には参考になる:

はこのような何かを試してみてください。 – APC

答えて

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

単一の結合を使用するのではなく、後で結合する利点は何ですか? –

+0

@Raj:結果セットに応じて、より高速になる場合があります。 – Eric

+1

'@ Raj':' Tags'のすべてのフィールドでグループ化するのを避けるためです。 – Quassnoi

1

を使用していただろう、常に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:注文番号COUNT(*)ではなくORDER BY 3を使用するのはなぜですか?クエリに列を追加すると問題が発生しませんか? –

+0

'order by count(*)'はカウントを再び開始します。すでに計算された列で注文するだけです。そして、はい、それはあなたが列を追加する場合、それを台無しにします。より良い解決策は、何かのように 'count'という名前を付けることです。 – Eric

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

+0

良いキャッチ、ありがとう。 –

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 
関連する問題