1

现在,我有两个表,Location并且q_Location,位置作为主表。我这样写 sql left join:

SQL1:
    SELECT L.ID,QL.* 
    FROM LOCATION L 
    LEFT JOIN Q_LOCATION QL ON L.ID=QL.LOCATION_ID 
                         AND L.WAREHOUSE_ID=QL.WAREHOUSE_ID
                         AND ISNULL(ql.VIRTUAL, 'N') = 'N' 
                         AND ISNULL(ql.PICKABLE, 'y') = 'Y' 
    where l.warehouse_id='mmc-main

但结果是错误的。if sql语句如下:

SQL2:  
    SELECT L.ID,QL.* 
    FROM LOCATION L 
    LEFT JOIN Q_LOCATION QL ON L.ID=QL.LOCATION_ID 
                            AND L.WAREHOUSE_ID=QL.WAREHOUSE_ID
    where l.warehouse_id='mmc-main' 
    AND ISNULL(ql.VIRTUAL, 'N') = 'N'
    AND   ISNULL(ql.PICKABLE, 'y') = 'Y' 

现在结果是否正确。我想知道为什么第一个sql是错误的,有人可以帮助我吗?先谢谢了!

4

1 回答 1

3

在 OUTER JOIN(左或右)中应用过滤器时要小心——它与在 WHERE 子句中应用过滤器不同。您的第一个查询没有按预期工作,因为如果连接失败,仍将返回 LEFT 表行,并且您的附加 RIGHT 表过滤器ISNULL(ql.VIRTUAL, 'N') = 'N'ISNULL(ql.PICKABLE, 'y') = 'Y'被忽略。

另请参阅:使用 JOIN 时的 WHERE 子句与 ON

于 2012-09-11T08:36:26.353 回答