如何保持子选择取消一组id的资格

时间:2012-09-25 13:40:34

标签: sql subquery

我不知道要去哪里。 这是我想要做的...... 想象一下,有一个“系统”,里面有5个盒子......每个盒子有10个口袋,可以容纳物品。数据库在口袋级别跟踪库存。 我需要一个itemid列表,它们不在父系统中的任何位置(因为它们仍然可能放在其他系统的口袋中。

tblpocket
----------
systemid, itemid, pocketid, curqty
1,        PFLI,   12,       0      
1,        MEP50,  16,       0       
1,        PFLI,   20,       0       
1,        OND5,   32,       0       
2,        OXBUT,  10,       0       
2,        DIPL,   12,       0       
2,        OXBUT,  16,       1       
2,        PFLI,   18,       1

除了“OXBUT”itemid之外的所有项目都需要返回。您还可以看到如何进行子选择以排除itemid curqty>的位置。 0将完全排除在系统标识1上存储的结果中。

我有300个SystemID和数千个ItemID,所以一次做systemid不是一个选择。

以下是我开始做的事情:

SELECT systemid, itemid
FROM TblPocket
WHERE curqty = 0 AND itemid NOT IN
 (Select itemid from tblpocket where curqty > 0)
GROUP BY systemid, itemid

这就是我被绊倒的地方.... :( 提前感谢您的想法:)

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题。 。 。您正在寻找系统中curqty = 0的项目。但是,一件商品可能在一个以上的口袋里。这似乎是一个合理的解释“我需要一个itemid的列表,它们不在父系统中的任何地方”(因为它们仍然可能放在其他系统的口袋里。)。

这是一个聚合查询:

select systemid, itemid
from TblPocket
group by systemid, itemid
having sum(curqty) = 0
order by systemid

然而,你的OXBUT示例提示了一些不同的东西:全部为0或者不是0的项。这是对HAVING子句的简单修改:

select systemid, itemid
from TblPocket
group by systemid, itemid
having sum(case when curqty = 0 then 1 else 0 end) = 0 or  -- all not zero
       sum(case when curqty > 0 then 1 else 0 end) = 0     -- all zero
order by systemid