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