我不知道要去哪里。 这是我想要做的...... 想象一下,有一个“系统”,里面有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
这就是我被绊倒的地方.... :( 提前感谢您的想法:)
答案 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