使用LEFT JOIN的SQL查询返回没有结果

时间:2017-10-24 19:52:12

标签: mysql left-join

我有2个MySQL表IM_TransferIM_INV。我定期运行以下查询:

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

大多数情况下,IM_Transfer中的大部分行都与IM_TransferskuIM_INVITEM_NO匹配,{39}} ; t在最后两列中返回null个值。

我刚刚使用IM_Transfer中的单行运行此查询,并且IM_INV中没有任何匹配的数据。如何更新查询以仅在nullLOC_ID列中返回仅包含QTY_ON_HND的行?

提前致谢

1 个答案:

答案 0 :(得分:0)

当外连接表中有一行时,where子句仅计算为true。在where子句中引用外连接表中的列通常会使连接成为内连接。

我认为您想要的查询是:

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

注意:

  1. ASC是默认排序顺序,因此不需要指定。
  2. 表达为LOC_ID IN ("AF","LO","S","SL")
  3. 时,您的LOC_ID过滤器更简单

    感谢@SeanLange指出我正确的方向。