2017-10-24 1 views
0

Ich habe 2 MySQL-Tabellen IM_Transfer und IM_INV. Ich die folgende Abfrage regelmäßig:SQL-Abfrage mit LEFT JOIN gibt keine Ergebnisse zurück

SELECT 
    `IM_Transfer`.`sku`, 
    `IM_Transfer`.`vendor_sku`, 
    `IM_Transfer`.`Description`, 
    `IM_Transfer`.`Receiver`, 
    `IM_INV`.`LOC_ID`, 
    `IM_INV`.`QTY_ON_HND` 
FROM 
    `IM_Transfer` 
LEFT JOIN 
    `IM_INV` 
ON 
    `IM_Transfer`.`sku` = `IM_INV`.`ITEM_NO` 
WHERE `LOC_ID` = "AF" 
    OR `LOC_ID` = "LO" 
    OR `LOC_ID` = "S" 
    OR `LOC_ID` = "SL" 
ORDER BY 
    `IM_Transfer`.`sku`, 
    `IM_INV`.`LOC_ID` 
    ASC 

Die meiste Zeit sind die meisten der Linien in IM_Transfer Spiel von IM_Transfer. sku und IM_INV. ITEM_NO und diejenigen, die nicht mit null Werte in den letzten 2 Spalten zurückkommen.

Ich habe gerade diese Abfrage mit einer einzigen Zeile in IM_Transfer ausgeführt und es hat keine übereinstimmenden Daten in IM_INV. Wie aktualisiere ich die Abfrage, um immer noch eine Zeile mit nur null in den Spalten LOC_ID und QTY_ON_HND zurückzugeben?

Vielen Dank im Voraus

+0

Sie sollten beim Markieren vorsichtig sein. mysql <> SQL-Server. –

+5

Das Problem hier ist, weil Sie Ihren linken Join in einen inneren Join mit Ihrer Where-Klausel umgewandelt haben. Sie sollten sich angewöhnen, bei der Referenzierung von Spalten immer die Tabelle anzugeben. –

+2

http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN – HLGEM

Antwort

0

Der where-Klausel nur den Wert true, wenn eine Zeile in der äußeren Join-Tabelle gibt. Wenn Sie auf eine Spalte aus der äußeren verbundenen Tabelle in einer where-Klausel verweisen, wird die Verknüpfung normalerweise zu einer inneren Verknüpfung.

Ich denke, dass die Abfrage, die Sie wollen, ist:

SELECT 
    `IM_Transfer`.`sku`, 
    `IM_Transfer`.`vendor_sku`, 
    `IM_Transfer`.`Description`, 
    `IM_Transfer`.`Receiver`, 
    `IM_INV`.`LOC_ID`, 
    `IM_INV`.`QTY_ON_HND` 
FROM 
    `IM_Transfer` 
LEFT JOIN 
    `IM_INV` 
ON 
`IM_Transfer`.`sku` = `IM_INV`.`ITEM_NO` 
AND (`LOC_ID` = "AF" 
    OR `LOC_ID` = "LO" 
    OR `LOC_ID` = "S" 
    OR `LOC_ID` = "SL") 
ORDER BY 
    `IM_Transfer`.`sku`, 
    `IM_INV`.`LOC_ID` 
ASC 

Hinweise:

  1. ASC ist die Standardsortierreihenfolge, so dass es nicht angegeben werden muss.
  2. Ihr LOC_ID Filter ist einfacher, wenn sie als LOC_ID IN ("AF","LO","S","SL")

Dank @SeanLange für den Hinweis mich in die richtige Richtung zum Ausdruck gebracht.

+0

Das hat es getan. Ich weiß, dass ich immer noch einen Weg habe, SQL zu verstehen. Vielen Dank – enano2054

Verwandte Themen