SQL如何根据该组的单个值是否等于某值来过滤整个值集?

问题描述

例如:

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”。

解决方法

换句话说,如果每个 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'
                 );
,

与维恩图一样,您可以使用 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'
    )