2012-09-11 53 views
1

现在,我有两个表,Locationq_Location,位置作为主表。我写SQL左加入这样的:SQL左连接无法得到正确的结果

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 

但结果是错误的。如果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' 

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

+0

也许你应该给予一定的结果,说什么是错,什么是正确的,哪些是你要实现的目标。 – Maarten

回答

3

小心在OUTER JOIN中应用过滤器(左侧或右侧) - 它与在WHERE子句中应用过滤器不同。您的第一个查询不像您预期​​的那样工作,因为如果连接失败,则仍会返回左表格行,并且您的其他RIGHT表格过滤器ISNULL(ql.VIRTUAL, 'N') = 'N'ISNULL(ql.PICKABLE, 'y') = 'Y'将被忽略。

参见这里:WHERE Clause vs ON when using JOIN

+1

非常感谢 –