MySql MINUS(相互作用)

时间:2016-06-03 10:27:28

标签: mysql inventory

我有两张桌子

  • inventory_lot_transactions和
  • inventory_lot_serials

我按批次记录了库存的所有交易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小提琴:

  1. 这是进入一个仓库http://sqlfiddle.com/#!9/3a4ab/7
  2. 的连续出版物的清单A.
  3. 这是从仓库http://sqlfiddle.com/#!9/3a4ab/8
  4. 中走出的连续出版物的清单B.

    基本上我想选择此仓库中仍然可用的所有连续出版物。例如。清单A - 清单B.

2 个答案:

答案 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在这里小提琴: -

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