MySql MINUS(交叉点的对面)

MySql MINUS (opposite of intersaction)

我有两张桌子

我正在按批次记录进出库存的所有交易。从仓库中预订的每个批次 in/out 都有自己的批次序列号,每次进出交易都会记录这些序列号。

现在我想获取所有在X仓库中仍然可用的序列号。基本上我想实现这个:

SELECT serials FROM table_a where transaction_type=In
MINUS
SELECT serials FROM table_a where transaction_type=Out

我准备了两个SQL小提琴:

  1. 这是进入一个仓库的连续出版物列表 A http://sqlfiddle.com/#!9/3a4ab/7
  2. 这是出库的连载列表Bhttp://sqlfiddle.com/#!9/3a4ab/8

基本上我想要select这个仓库中仍然可用的所有连续剧。例如。列表 A - 列表 B.

不确定我是否理解正确,您应该可以在您的 where 条件中使用 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)

可能使用 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

这会对 table 中的库存进行内部连接(因为您只对有库存进入的记录感兴趣,因此不需要对此进行外部连接),然后进行 LEFT OUTER JOIN到库存出来 table。然后 WHERE 子句丢弃在 table.

清单中找到的项目

SQL fiddle 在这里:-

http://www.sqlfiddle.com/#!9/10c0a/8