0

我正在构建一个数据库,该数据库将包含标记,并使用了 '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说“外部联接可以嵌套在多表联接中的内部联接中,但内部联接不能嵌套在外部联接中”,但我找不到任何嵌套两个不引发错误的联接的方法。据我所知,我需要 LEFT JOIN 才能出现在 Items 上。

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

4

1 回答 1

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
于 2013-03-01T02:10:21.573 回答