我有一张包含以下数据的表。现在,我只想选择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'
);
请在这里帮助我。
答案 0 :(得分:1)
首先,执行一个解释计划,因为转换器可能未嵌套该子查询。在那种情况下,它不会像看起来那样低效,并且该查询将正常运行。但是,这是一个语义上更干净的查询(可能比转换后的计划更好,也可能不会更好):
select GRP_ID
from myitem
group by GRP_ID
having min(TTYPE) = max(TTYPE) and
min(TTYPE) = 'Parcel';
这将确保每个组只有一种类型,并且一种类型是包裹。