MySql MINUS(交叉点的对面)
MySql MINUS (opposite of intersaction)
我有两张桌子
- inventory_lot_transactions 和
- inventory_lot_serials
我正在按批次记录进出库存的所有交易。从仓库中预订的每个批次 in/out 都有自己的批次序列号,每次进出交易都会记录这些序列号。
现在我想获取所有在X仓库中仍然可用的序列号。基本上我想实现这个:
SELECT serials FROM table_a where transaction_type=In
MINUS
SELECT serials FROM table_a where transaction_type=Out
我准备了两个SQL小提琴:
- 这是进入一个仓库的连续出版物列表 A http://sqlfiddle.com/#!9/3a4ab/7
- 这是出库的连载列表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 在这里:-
我有两张桌子
- inventory_lot_transactions 和
- inventory_lot_serials
我正在按批次记录进出库存的所有交易。从仓库中预订的每个批次 in/out 都有自己的批次序列号,每次进出交易都会记录这些序列号。
现在我想获取所有在X仓库中仍然可用的序列号。基本上我想实现这个:
SELECT serials FROM table_a where transaction_type=In
MINUS
SELECT serials FROM table_a where transaction_type=Out
我准备了两个SQL小提琴:
- 这是进入一个仓库的连续出版物列表 A http://sqlfiddle.com/#!9/3a4ab/7
- 这是出库的连载列表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 在这里:-