标记:用于返回已标记和未标记项的SQL查询

时间:2013-03-01 02:08:39

标签: sql ms-access tagging

我正在构建一个包含标记的数据库,并使用了'toxi'模式,我有3个表:

Items: Item, ItemID, more fields
Tags: TagName, TagID, more fields
TagMap: TagID, ItemID

我正在尝试构建一个查询,列出所有项目及其标签,其中许多项目可能没有标签。我找不到可以同时执行这两项操作的查询。

以下查询按名称获取带有标记的项目,但只会提取拥有标记的项目。

SELECT Items.Item, Tags.Tag
FROM Items INNER JOIN 
(Tags INNER JOIN TagMap ON Tags.ID = TagMap.TagId)
ON Items.ID = TagMap.ItemId;

以下查询会获取所有项目及其TagID,如果它们已被标记,但我似乎无法进入下一步将TagID转换为TagNames的单个查询。

SELECT [Items].Item, [TagMap].TagId
FROM Items LEFT JOIN TagMap ON [Items].ID=TagMap.ItemId;

MSDN说“OUTER JOIN可以嵌套在多表连接中的INNER JOIN中,但是INNER JOIN不能嵌套在OUTER JOIN中”,但我找不到任何嵌套这两个连接的方法不会抛出错误。据我所见,我需要LEFT JOIN作为项目。

我正在使用Access在概念数据库上构建我的证明,因为它已经安装在我的机器上。我可能会在某些时候切换到SQL Server。

1 个答案:

答案 0 :(得分:1)

你很接近 - 只需添加1个LEFT JOIN

SELECT [Items].Task, [TagMap].TagId, Tags.TagName
FROM Items 
    LEFT JOIN TagMap ON [Items].ID=TagMap.TaskId
    LEFT JOIN Tags ON TagMap.TagID=Tags.TagID

由于你正在使用MS Access,你需要在你的连接周围使用括号 - 这样的事情应该是关闭的:

SELECT [Items].Task, [TagMap].TagId, Tags.TagName
FROM (Items 
    LEFT JOIN TagMap ON [Items].ID=TagMap.TaskId)
    LEFT JOIN Tags ON TagMap.TagID=Tags.TagID