选择所有子项仅包含相同值且没有其他方案的行

Posted

技术标签:

【中文标题】选择所有子项仅包含相同值且没有其他方案的行【英文标题】:Select rows where all children contain same value only and no other scenario 【发布时间】:2019-10-15 16:41:29 【问题描述】:

我正在编写一个查询来选择所有子项仅包含相同值且没有其他情况的所有行。

在网上试了很多例子,没有匹配的。

从所有子项仅包含相同值且没有其他情况的表中选择 *。必须包含至少一个要返回的孩子。

子代通过 ID 映射到父代。 子值是一列,它可以是 int 或 null。假设所有孩子都必须包含 5 的值,并且没有其他要包含的值。如果大多数孩子都包含 5 个,则将不起作用,它必须是所有孩子都只有 5 个的只有父母。 父母可能有多个孩子 父母可能没有孩子(在这种情况下,不包括在结果中)

示例父母:

A(id: 1), B(id: 2), C(id: 3), D(id: 4), E(id: 5).
children id mapping: AAA, BB, CCCCC, E
children values: 
A:5, A:5, A:3
B:5, B:null
C:5, C:5, C:5, C:5, C:5
E:null

那么唯一会返回的父节点是 C,因为 C 的所有子节点都只包含 5 个。

您看到 A 不起作用,因为 A 的一个孩子包含 3 并且必须都是 5。 您会看到 B 没有返回,因为 B 的一个孩子包含 null 而不是所有 5。

【问题讨论】:

文本表格格式的数据真的很有帮助。设置某种 db fiddle 至少可以让其他人理解您的数据结构。 【参考方案1】:

假设你的数据结构是:

parentid   childid   value

然后你可以用聚合做你想做的事:

select parentid
from t
group by parentid
having min(value) = max(value) and  -- all values are the  same
       min(value) = 5               -- and that value is 5

如果 value 可以是 NULL 并且您想避免这种情况,还包括:

 count(value) = count(*)

【讨论】:

这也将返回包含NULL 作为值的'B'。 谢谢!惊人的快速回答。

以上是关于选择所有子项仅包含相同值且没有其他方案的行的主要内容,如果未能解决你的问题,请参考以下文章

选择包含相同值的行

如何使用窗口函数仅在 POSTGRES 中选择不超过某个值的行

MySQL返回列包含任何但仅包含一组关键字的所有行

隐藏和显示剑道网格​​的行

选择所有没有子项的空

使用正则表达式仅选择带有错误代码 (-) 的行并忽略其他行