Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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_Sql Server - Fatal编程技术网

Sql 如何选择相关表中具有多个值的记录?

Sql 如何选择相关表中具有多个值的记录?,sql,sql-server,Sql,Sql Server,我有以下三个用于标记内容的表,其中每个内容可以有一到多个标记。例如,内容记录可以有一个标记California和Variable 表w/内容 Content -ContentID -ContentName 表w/标签 Tag -TagID -TagName 链接内容和标记的表 ContentTag -ContentID -TagID 使用下面的SELECT语句,我希望获得TagID为21和54的记录,但是不返回任何行 SELECT * FROM ContentTag INNER JOIN

我有以下三个用于标记内容的表,其中每个内容可以有一到多个标记。例如,内容记录可以有一个标记California和Variable

表w/内容

Content
-ContentID
-ContentName
表w/标签

Tag
-TagID
-TagName
链接内容和标记的表

ContentTag
-ContentID
-TagID
使用下面的SELECT语句,我希望获得TagID为21和54的记录,但是不返回任何行

SELECT * FROM ContentTag
INNER JOIN Content On ContentTag.ContentID=Content.ContentID
INNER JOIN Tag ON ContentTag.TagID=Tag.TagID
Where (Tag.TagID=21 And Tag.TagID=54)

如何创建SQL SELECT语句来检索具有一对多标记的内容?

我喜欢使用聚合和
having
子句来解决这个问题:

SELECT c.ContentId, c.ContentName
FROM ContentTag ct INNER JOIN
     Content c
     On ct.ContentID = c.ContentID 
WHERE ct.TagID IN (21, 54)
GROUP BY c.ContentId, c.ContentName
HAVING COUNT(Distinct ct.TagId) = 2;
一些注意事项:

  • 您不需要将
    连接到标签表。您正在使用
    ContentTag
    中的id
  • 您不需要
    *
    。我猜您正在查找包含两个标签的内容
  • WHERE
    子句将标记限制为所讨论的两个标记
  • HAVING
    子句确保两者都存在

Gordon,在where条件下,您使用了t.TagID,但别名“t”是SELECT查询中哪个表的别名。@PareshJ。这个别名应该是
ct
而不是
t
。如果我有一个可以超过两个标记的标记ID列表,该怎么办?@Harry.Naeem。您可以将它们添加到
列表中的
,并增加
2