使用AND条件查找所有记录的基本SQL查询

编程语言 2026-07-10

我的数据库有一个名为 Items 的项表,使用 ID 作为主键。另一张表 Tags 列出物品的属性(Topic),以 ItemIDTopic 作为复合主键。一个物品可以拥有一个或多个主题,这些主题来自第三张表 Topics,通过外键 [Topic] 进行关联。

Items

物品ID 物品名称
1 ItemA
2 ItemB
3 ItemC
4 ItemD

Tags

物品ID 主题
1 TopicA
2 TopicA
2 TopicB
3 TopicC

我正在查找具有TopicA或 TopicB的物品,使用以下SQL语句:

SELECT [ID], [ItemName] 
FROM [MyDB].[dbo].[Items]
WHERE [ID] IN (SELECT [ItemID] 
               FROM [MyDB].[dbo].[Tags] 
               WHERE [Topic] IN (SearchStringList))

这会列出至少包含用户所选主题之一的物品,也就是一个 OR 条件。

当前结果(OR 查询)将是:

物品ID 物品名称
1 ItemA
2 ItemB

我想找出同时包含所选全部主题的物品,也就是应用一个 AND 查询。

查找同时具有 TopicATopicB 的物品。

AND 查询的期望结果应该是:

物品ID 物品名称
2 ItemB

我觉得应该使用视图和/或连接来实现,但就是想不出来怎么写。

解决方案

你没有提到所使用的关系数据库管理系统(RDBMS),但这属于对匹配主题进行分组与计数的场景,大致可以这样写:

SELECT [ID], [ItemName] 
FROM [MyDB].[dbo].[Items]
JOIN [MyDB].[dbo].[Tags] ON [ItemId] = [Id]
WHERE [Topic] IN (SearchStringList)
GROUP BY [ID], [ItemName] 
HAVING COUNT([Topic]) = SearchStringListLength

正如你所提到的,ItemId, Topic 是主键且唯一,否则你需要进行去重计数(DISTINCT)。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章