我正在尝试优化我的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。
答案 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)