2016-06-03 18 views
0

Ich habe zwei TabellenMySql MINUS (Gegenteil von intersaction)

  • inventory_lot_transactions und
  • inventory_lot_serials

ich alle Transaktionen IN und OUT des Inventars durch das Los der am einloggt. Jedes Los, das aus dem Lager gebucht wird, hat seine eigene Charge von Seriennummern, die für jede IN- und OUT-Transaktion protokolliert werden.

Jetzt möchte ich alle Seriennummern erhalten, die noch in X-Warehouse verfügbar sind. Grundsätzlich würde ich dies erreichen mag:

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

Ich habe zwei SQL Geigen hergestellt:

  1. Dies ist die Liste A der Serien, die in einem Lager kam http://sqlfiddle.com/#!9/3a4ab/7
  2. Dies ist die Liste B von Serien, die aus dem Lager gingen http://sqlfiddle.com/#!9/3a4ab/8

Grundsätzlich möchte ich alle Serien auswählen, die noch in diesem Lager verfügbar sind. Z.B. Liste A - Liste B.

+0

Sie haben die gleiche Abfrage zweimal, aber mit unterschiedlichen Parametern für eine Spalte. Heißt das nicht, wenn es "nicht raus" ist, ist es "in"? – Philipp

Antwort

2

Nicht sicher, ob ich richtig verstanden habe, sollten Sie NOT IN in Ihrem Wo-Zustand verwenden können. 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) 
+0

Oh so einfach :). Ich habe so viel darüber nachgedacht, dass ich 'NOT IN' vergessen habe :) –

1

verwenden Möglicherweise LEFT OUTER JOIN die Verwendung von Unterabfragen zu vermeiden: -

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 

Dies bringt eine Innen zum Inventar in Join-Tabelle (wie Sie in Aufzeichnungen nur daran interessiert sind, wo es Inventar, das da reinkommt, braucht keinen äußeren Join auf diesem), dann ein LINKER OUTER JOIN zur Inventur-Tabelle. Dann verwirft die WHERE-Klausel Elemente, die in der Inventur-Tabelle gefunden werden.

SQL Geige für sie hier: -

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

+0

dies gibt mir nicht das erwartete Ergebnis ... –

+0

@PrimozRome - einige kleinere Mods gemacht. Gibt die gleichen Ergebnisse. Ohne Unterabfragen würde ich erwarten, dass dies schneller geht, besonders bei großen Datenmengen. – Kickstart

+0

Jetzt funktioniert es richtig, vielen Dank. Ich werde testen, welcher schneller ist und dementsprechend als akzeptierte Antwort gesetzt. –