Sql 在给定这3个表的情况下生成标记云计数

Sql 在给定这3个表的情况下生成标记云计数,sql,tags,Sql,Tags,我有这三个表来存储相册的标签。这是模式 表1:相册 相册\u ID 相册名称 表2:AlbumTags 标签ID 标签名称 表3:AlbumTagBridge ID 标签ID 相册编号 能够产生如下结果集的最有效的SQL是什么: 标签|名称|计数 标签1 | 19 标签2|3 标签3 | 17 Select Tag_Name, COUNT(AlbumTagBridge.ID) From AlbumTags Join AlbumTagBridge USING(Tag_ID) Group By Ta

我有这三个表来存储相册的标签。这是模式

表1:相册
相册\u ID
相册名称

表2:AlbumTags
标签ID
标签名称

表3:AlbumTagBridge
ID
标签ID
相册编号

能够产生如下结果集的最有效的SQL是什么:

标签|名称|计数
标签1 | 19
标签2|3
标签3 | 17

Select Tag_Name, COUNT(AlbumTagBridge.ID)
From AlbumTags
Join AlbumTagBridge USING(Tag_ID)
Group By Tag_Name

按AlbumTags.Tag\u ID、Tag\u name进行分组可能会稍微便宜一些,这取决于您的索引&c(特别是如果您的SQL引擎没有那么智能;-),但由于您没有告诉我们有关索引或引擎的任何信息,这是我们能做的最好的事情。

现在我根本没有索引。我使用的是SQL server 2008此代码还假设标记名是唯一的;i、 例如,没有两个ID不同但名称相同的标签。我认为这是一个很好的假设,应该使用唯一的约束强制执行。运行此查询会给我一个错误:“Tag_ID”不是可识别的表提示选项。如果要将其作为表值函数或CHANGETABLE函数的参数,请确保数据库兼容模式设置为90。请尝试在AlbumTagBridge.Tag_ID=AlbumTags.Tag_ID上加入AlbumTagBridge,但不确定它为什么会反对使用
,但似乎是这样我假设你不在乎专辑,只在乎所有专辑的标签数。
SELECT dbo.AlbumTags.Tag_Name, 
       COUNT(dbo.AlbumTagBridge.Tag_Id) AS Cnt
FROM dbo.AlbumTagBridge 
INNER JOIN dbo.AlbumTags ON dbo.AlbumTagBridge.Tag_Id = dbo.AlbumTags.Tag_ID
GROUP BY dbo.AlbumTags.Tag_Name