根据单列值过滤数据

时间:2018-08-07 20:57:19

标签: oracle self-join

我有一张包含以下数据的表。现在,我只想选择ITEM_NO仅为包裹类型的GRP_ID。如果某些商品同时具有TTYPE(例如包裹和卡车),那么就不会出现这种情况。

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'
);

请在这里帮助我。

1 个答案:

答案 0 :(得分:1)

首先,执行一个解释计划,因为转换器可能未嵌套该子查询。在那种情况下,它不会像看起来那样低效,并且该查询将正常运行。但是,这是一个语义上更干净的查询(可能比转换后的计划更好,也可能不会更好):

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

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