SQL IN 子句中包含 AND 逻辑

标签 sql sql-server

默认 IN 使用 OR 基本逻辑。有没有办法在范围内使用 AND 基本逻辑。

例如下面的查询

SELECT ItemId,CategoryID
FROM ItemCategories
WHERE CategoryID IN (4,5)

一个项目可以有多个类别。考虑以下子集作为项目

|ItemID | CategoryID |
| 1     | 4          |
| 1     | 5          | 
| 2     | 4          |
| 2     | 6          |
| 3     | 4          |
| 3     | 5          | 

有什么办法可以排除 item2 吗?由于项目 2 的类别为 6。我想要的项目必须同时包含 4 和 5。

使用 IN 子句在这里没有帮助。 4,5 范围也是动态的。

最佳答案

除了使用 IN ()仅限制行集,您需要验证 DISTINCT一套CategoryIDItemID 。要确保某个项目同时存在于两个类别中,请验证其聚合 COUNT()是 2(等于 IN () 中的项目数)。

SELECT
  ItemID
FROM ItemCategories
WHERE CategoryID IN (4,5)
GROUP BY ItemID
-- When there are exactly 2 distinct categories
-- you can be certain that they are the 2 requested in the 
-- IN () clause
-- The value here must be equal to the number of items in the IN ()
HAVING COUNT(DISTINCT CategoryID) = 2

这是一个演示:http://sqlfiddle.com/#!6/c9b6c/1

注意:这将提供与您的 IN () 完全相同的集合。条款,没有别的。如果您需要包括那些可能有其他类别但不在 IN () 中的类别,只需将其更改为 >=而不是=HAVING .

HAVING COUNT(DISTINCT CategoryID) >= 2

关于SQL IN 子句中包含 AND 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23984953/

相关文章:

sql - SQL Server存储过程-插入语法错误

sql-server - SQL Server 中的 "with (nolock)"是什么?

mysql - MySQL 中列的条件文本连接。一些短语完全匹配,另一些正则表达式

MySQL 错误 : Unknown column in 'where clause'

mysql - 如何重写jpql自定义查询中给定的查询?

c# - 插入一张表,获取id并插入另一张表

sql-server - 经典 ASP - SQL Server 不存在或访问被拒绝

sql - 如何在同一张表中以不同条件检索同一列两次?

SQL Server 非常乐意添加日期和月份

sql - 什么是数据库约束?