我正在构建一个包含标记的数据库,并使用了'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。
答案 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