问题描述
例如:
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'
)