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如何根据该集合的单个值是不是等于某物来过滤出整个值集?的主要内容,如果未能解决你的问题,请参考以下文章