SQL如何根据该集合的单个值是不是等于某物来过滤出整个值集?

Posted

技术标签:

【中文标题】SQL如何根据该集合的单个值是不是等于某物来过滤出整个值集?【英文标题】:SQL How to filter out an entire set of values dependent upon whether a single value of that set is equal to something?SQL如何根据该集合的单个值是否等于某物来过滤出整个值集? 【发布时间】:2021-05-13 15:21:40 【问题描述】:

例如:

DEPT   ||   Y/N
-----     -----
GENRL     Y
GENRL     Y
GENRL     Y
GENRL     N

DNREV     Y
DNREV     Y
DNREV     Y
DNREV     Y

DNPAP     N
DNPAP     N
DNPAP     N
DNPAP     Y

我正在搜索所有部门,但不想列出至少有一个列表的 Y/N 值为“N”的任何部门。换句话说,我只希望每个 Y/N 值都是“Y”的部门返回。

我想要的回报只是 DNREV 部门,因为该部门的所有记录都是“Y”。

【问题讨论】:

【参考方案1】:

换句话说,我只希望每个 Y/N 值都是“Y”的部门返回。

你可以使用聚合:

select dept
from t
group by dept
having min(y_n) = 'Y';

这使用了'Y' > 'N'这一事实。

如果您想要完整的行,请使用 not exists:

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.dept = t.dept and t2.y_n = 'N'
                 );

【讨论】:

在此表中,我选择的不仅仅是我列出的那两列。我真的必须列出 GROUP BY 区域中的每一列吗?那里有 9 列。 @TroyN.Wingert 。 . .这回答了您提出的问题。 它仍在显示至少有 1 条记录为“N”的部门。所有显示的值都是带有“Y”的记录,但如果某个部门在表格上有带有“N”的记录,我根本不希望在输出中显示该部门。您提供的此查询仅对“N”值记录进行排序,但将具有“N”值的部门的“Y”值记录留在表中。 @TroyN.Wingert 。 . .任何一个查询都不是这样,除非你有一个拼贴,其中'N' 大于'Y'——这是非常不寻常的。 因此,其他列之一是 DEPT_ID。一个例子是 DEPT_ID 值为 28。这个部门,在表上,有一些 Y/N 值 'Y' 和一些 'N',我不希望这个部门出现在结果中,因为有些记录有值'N'。提供的此查询仍返回该部门,但仅显示该部门的具有“Y”值的记录,而不是根本不返回它。【参考方案2】:

与维恩图一样,您可以使用 MINUS 运算符删除相交的部门(带有“Y”和“N”的部门)。在某些数据库系统中,它也称为 EXCEPT。如果你颠倒子查询的顺序,你会得到相反的结果——所有有“N”而没有“Y”的部门。

select *
from t 
where dept in (
    select dept
    from t
    where y_n = 'Y'
    minus
    select dept
    from t
    where y_n = 'N'
    )

【讨论】:

以上是关于SQL如何根据该集合的单个值是不是等于某物来过滤出整个值集?的主要内容,如果未能解决你的问题,请参考以下文章

iOS Firebase 获取值等于某物的数据

过滤,绑定及动画

过滤,绑定及动画

如何检查树枝中的变量是不是等于零并定义值

过滤器绑定事件动画

过滤器,绑定事件,动画