我有两张桌子
我按批次记录了库存的所有交易IN和OUT。从仓库进入/退出预订的每个批次都有自己的一批序列号,这些序列号会记录每次IN和OUT交易。
现在我想获得X仓库中仍然可用的所有序列号。基本上我想实现这个目标:
SELECT serials FROM table_a where transaction_type=In
MINUS
SELECT serials FROM table_a where transaction_type=Out
我准备了两个SQL小提琴:
基本上我想选择此仓库中仍然可用的所有连续出版物。例如。清单A - 清单B.
答案 0 :(得分:2)
不确定我是否理解正确,你应该能够在你的情况下使用NOT IN。 http://sqlfiddle.com/#!9/3a4ab/10
select IL.lot_id, ILS.serial_id
from inventory_lot_serials ILS
left join inventory_lots IL ON IL.id=ILS.inventory_lot_id
where
IL.type='In' and
IL.warehouse_location_id=500
AND ILS.serial_id NOT IN
(SELECT ILS.serial_id
from inventory_lot_serials ILS
left join inventory_lots IL ON IL.id=ILS.inventory_lot_id
where
IL.type='Out' and
IL.warehouse_location_id=500)
答案 1 :(得分:1)
可能使用LEFT OUTER JOIN来避免使用子查询: -
SELECT IL.lot_id,
ILS.serial_id
FROM inventory_lots IL
INNER JOIN inventory_lot_serials ILS ON IL.id = ILS.inventory_lot_id
LEFT OUTER JOIN inventory_lots ILO ON ILO.lot_id = IL.lot_id AND ILO.type = 'Out' AND ILO.warehouse_location_id = 500
LEFT OUTER JOIN inventory_lot_serials ILSO ON ILO.id = ILSO.inventory_lot_id AND ILS.serial_id = ILSO.serial_id
WHERE IL.type = 'In'
AND IL.warehouse_location_id = 500
AND ILSO.inventory_lot_id IS NULL
这是对表中库存的内部联接(因为您只对存在库存的记录感兴趣,不需要对此进行外部联接),然后是LEFT OUTER JOIN到库存表。然后WHERE子句丢弃在清单输出表中找到的项目。
SQL在这里小提琴: -