Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
标记:返回标记项和未标记项的SQL查询_Sql_Ms Access_Tagging - Fatal编程技术网

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

标记:返回标记项和未标记项的SQL查询,sql,ms-access,tagging,Sql,Ms Access,Tagging,我正在构建一个包含标记的数据库,并采用了“toxi”模式,其中我有3个表: Items: Item, ItemID, more fields Tags: TagName, TagID, more fields TagMap: TagID, ItemID 我正在尝试构建一个查询,该查询将列出所有项目及其标记,其中许多项目可能没有标记。我找不到一个既能做这两件事的查询 下面的查询按名称获取带有标记的项目,但只提取带有标记的项目 下面的查询将获取所有项目及其标记ID(如果它们已被标记),但我似乎无法

我正在构建一个包含标记的数据库,并采用了“toxi”模式,其中我有3个表:

Items: Item, ItemID, more fields
Tags: TagName, TagID, more fields
TagMap: TagID, ItemID
我正在尝试构建一个查询,该查询将列出所有项目及其标记,其中许多项目可能没有标记。我找不到一个既能做这两件事的查询

下面的查询按名称获取带有标记的项目,但只提取带有标记的项目

下面的查询将获取所有项目及其标记ID(如果它们已被标记),但我似乎无法在单个查询中将这些标记ID转换为标记名

SELECT [Items].Item, [TagMap].TagId
FROM Items LEFT JOIN TagMap ON [Items].ID=TagMap.ItemId;
说“外部联接可以嵌套在多表联接中的内部联接中,但内部联接不能嵌套在外部联接中”,但我找不到任何嵌套这两个联接而不引发错误的方法。就我所见,我需要在项目上使用左连接

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

你很接近了--只需要添加1个额外的
左连接

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

谢谢成功了。如果我可以问一下,为什么又有一个左派加入?对我来说,标签的映射似乎真的必须是一个内部连接。@AlwaysSimmer--np,很高兴我能帮上忙。如果标记映射和/或标记表中不存在记录,则需要使用左连接。这样,您将始终收到Items.Task字段,但可能会收到TagId和/或标记名字段的空值(如示例中所示)。祝你好运!
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