Oracle 基于单列的值筛选数据

Oracle 基于单列的值筛选数据,oracle,self-join,Oracle,Self Join,我有一个包含以下数据的表格。现在我只想选择其项目号仅为地块类型的GRP\U ID。如果存在同时具有“包裹”和“卡车”两种类型的项目,则不应出现该结果 GRP_ID ITEM_NO TTYPE 00001 12345 Parcel 00001 12346 Parcel 00001 12347 Parcel 00002 12348 Parcel 00002 12349 Parcel 00002 12349 Truck 因此,对于上述数据,结果应仅为

我有一个包含以下数据的表格。现在我只想选择其项目号仅为地块类型的GRP\U ID。如果存在同时具有“包裹”和“卡车”两种类型的项目,则不应出现该结果

GRP_ID  ITEM_NO TTYPE
00001   12345   Parcel
00001   12346   Parcel
00001   12347   Parcel
00002   12348   Parcel
00002   12349   Parcel
00002   12349   Truck
因此,对于上述数据,结果应仅为GRP_ID='00001'。我尝试了以下方法,但我想一定有更好的方法:

select * from myitem where GRP_ID not in (
    SELECT GRP_ID FROM myitem where TTYPE='Truck'
);

请在此帮助我。

首先,做一个解释计划,因为转换器可能不需要子查询。在这种情况下,它将不会像看上去那样低效,并且查询将正常运行。但是,这里有一个语义更清晰的查询可能比转换后的计划更好,也可能不更好:

select GRP_ID
from myitem
group by GRP_ID
having min(TTYPE) = max(TTYPE) and
       min(TTYPE) = 'Parcel';

这将确保每个组只有一种类型,并且其中一种类型是包裹。

如果有效,则使用它。选择*从myitem中选择grp_id,从myitem中选择grp_id,其中ttype='Parcel'减去从myitem中选择grp_id,其中ttype='Truck';嗨,罗杰,是的,它像我期望的那样工作,谢谢你的帮助。。。您是否考虑过在加载数据时哪个查询会执行得更好?如果grp_id和ttype在索引中被索引为ttype第一个元素,那么这个减号操作将在索引中完全解决。gpr_id上的另一个索引本身意味着外部选择也被索引。这应该可以很好地扩展。根据我的经验,NOT In的伸缩性不如负数。对Jonathan很好,不是一个很好的查询结构。。我喜欢这种风格。。希望它在性能方面也很好,有什么想法吗?它应该非常有效,因为它只跟踪两个聚合列。