如何在子查询结果中找到记录,其中项目的结果为假且没有结果为真?

Posted

技术标签:

【中文标题】如何在子查询结果中找到记录,其中项目的结果为假且没有结果为真?【英文标题】:How can I find records in a subquery result where an item has a result which is false and has no results which are true? 【发布时间】:2022-01-22 22:31:30 【问题描述】:

我非常深入地研究连接和子查询的组合,最终得到的查询结果如下所示:我根本不处理弹珠,但我想解释这一点的一种方式是想象一个装有蓝色和红色弹珠的袋子。包 1 包含蓝色和红色,(因此结果为真和假),包 2 也相同。袋子 3 只包含蓝色弹珠,没有红色弹珠,因此只有一个条目是正确的。并且包 4 只包含红色的,所以值为 false。

我想要做的是选择所有没有“真”值的 ID。所以在下面的这个例子中,ID 1,2 和 3 都有一个值为“true”的行,而 ID 4 和 5 只包含 false(s) 而没有 true。所以我希望查询返回 ID 4 和 5。这些结果按它们的 ID 分组,所以我一直在尝试不同的 HAVING 子句,试图计算 COUNT of trues = 0 的特定想法但没有任何成功。

输入:这个表(这是更大查询的结果)

| ID | hasBlueMarbles   | 
| -- | ------- |
| 1  | true    |
| 1  | false   |
| 2  | true    |
| 2  | false   |
| 3  | true    |
| 4  | false   |
| 5  | false   |
| 5  | false   |

预期输出:只有值“false”而非“true”记录的 ID

| ID | 
| -- |
| 4  |
| 5  |

首先,这可能是一个非常奇怪的数据集,这可能意味着我在最初的查询中做错了什么,导致我来到这里。如果需要,我可以添加主查询,但脱离上下文可能会有点混乱。谢谢!

【问题讨论】:

【参考方案1】:

1. BOOL_OR()

你要找的函数是BOOL_OR()

Here解释为:

如果集合中的任何值为真,则 BOOL_OR 函数返回真 (t)。如果集合中没有值是 true,则函数返回 false (f)。

这里是:

SELECT ID, 
       BOOL_OR(hasBlueMarbles) AS HasBlueMarbles
FROM table
GROUP BY ID
HAVING BOOL_OR(hasBlueMarbles) = FALSE

2。 MAX()

或者您可以简单地使用MAX() 函数来获取最大的布尔值并过滤掉结果。

SELECT ID, 
       MAX(hasBlueMarbles) AS HasBlueMarbles
FROM table
GROUP BY ID
HAVING MAX(hasBlueMarbles) = 0

【讨论】:

完美!我从未听说过 BOOL_OR 或为此使用 MAX,但正如您所说,它确实是我正在寻找的功能。谢谢!

以上是关于如何在子查询结果中找到记录,其中项目的结果为假且没有结果为真?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 SQL 查询找到组结果的平均值?

查询以获取 table1 中每一行的结果,其中包含 N 个最大记录的子查询,找到满足 table2 中的条件

如何摆脱在子表单末尾添加新记录?

在子查询之间的 ORACLE 连接语句中选择顶部记录

Sqlite:在子查询“消除”结果中排序

多表查询结果出现重复记录,根据条件只取其中的一条记录的sql语句