【问题标题】:SQL Query similar to IN where clause with AND condition instead of ORSQL查询类似于带有AND条件而不是OR的IN where子句
【发布时间】:2017-12-04 05:25:36
【问题描述】:

我正在尝试优化我的 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 是否具有与所有三个 val21、val22、val23 的映射,就像我们对 val11 所做的那样。

使用 Informix DB。

【问题讨论】:

标签: sql select informix relational-division


【解决方案1】:

这称为“关系除法”。

通常的方法是这样的:

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

请注意,这也将包括超过column2 中分配的这三个值的值(因此它返回具有至少这三个值的值)

【讨论】:

    【解决方案2】:

    您也可以这样做,但请注意,它将返回 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)
    

    【讨论】:

    • 当问题中列出了特定值时,不清楚为什么要使用值 11 和 21。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多