使用AND条件查找所有记录的基本SQL查询
我的数据库有一个名为 Items 的项表,使用 ID 作为主键。另一张表 Tags 列出物品的属性(Topic),以 ItemID 和 Topic 作为复合主键。一个物品可以拥有一个或多个主题,这些主题来自第三张表 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 查询。
查找同时具有 TopicA 与 TopicB 的物品。
该 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。