SQL查询类似于带有AND条件而不是OR的IN where子句

时间:2017-06-30 09:34:55

标签: sql select informix relational-division

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

考虑我们在下表中有条目:

+-----------+-------------+
| 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是否具有与val11相同的所有三个val21,val22,val23的映射。

使用Informix DB。

2 个答案:

答案 0 :(得分:7)

这称为"关系师"。

通常采用的方法如下:

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

请注意,这还包括在column2中分配的值超过这三个值的值(因此它会返回至少这三个值的那些值)

答案 1 :(得分:0)

您也可以执行此操作,但请注意,它将返回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)