SQL 类似于 IN where 子句的查询,使用 AND 条件而不是 OR

SQL Query similar to IN where clause with AND condition instead of OR

我正在尝试优化我的 SQL 查询,这样我们就不必在 JVM 上处理响应。

假设我们有以下 table 条目:

+-----------+-------------+
| Column1   | Column2     |
+-----------+-------------+
|val11      |val21        |
|val11      |val22        |
|val11      |val23        |
|val12      |val21        |
|val12      |val24        |
+-----------+-------------+

现在,我想执行一个查询,结果是 column1s 的行映射到 Column2s 值 val21、val22、val23。

类似于 IN where 子句,但是,由于 IN where 子句搜索 IN 子句值之间具有 OR 的数据,我想在这些值之间搜索 AND。

对于 IN where 子句:

SELECT Column1 from table
WHERE Column2 IN (val21, val22, val23)

将产生 val11 和 val12(因为 IN 子句将使用 val21、val22 或 val23 检查数据)。

相反,我想要一些查询来检查 Column1 与所有三个 val21、val22、val23 的映射,就像我们对 val11 所做的那样。

使用 Informix 数据库。

这叫做"relational division"。

通常的做法如下:

select column1
from x
where column2 in ('val21', 'val22', 'val23')
group by column1
having count(distinct column2) = 3;

请注意,这还将包括比 column2 中指定的三个值更多的值(因此它 returns 那些 至少 那些三个值)

您也可以这样做,但请注意,它会 return column2 的记录少于 IN 之后的数组的情况。使用这种技术,您可以确保 column2 中的所有值在数组中都与给定的 column1 组匹配。确保正确处理 NULL 值。

SELECT column1
FROM t
WHERE t.column2  IN (11,21)
AND NOT EXISTS (SELECT 1
        FROM t t1
        WHERE  t1.column2  NOT IN (11,21)
        AND t1.column1 = t.column1)