1

今、私は2つのテーブルを持っていLocationますq_Location.メインテーブルとしての場所.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

しかし、結果は間違っています。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' 

now 正しければ結果。最初のSQLが間違っている理由を知りたいのですが、誰か助けてくれますか? 最初にありがとう!

4

1 に答える 1

3

OUTER JOIN (左または右) でフィルターを適用する場合は注意してください。これは、WHERE 句でフィルターを適用することと同じではありません。ISNULL(ql.VIRTUAL, 'N') = 'N'結合が失敗した場合でも、LEFT テーブルの行が返され、追加の RIGHT テーブルがフィルター処理されてISNULL(ql.PICKABLE, 'y') = 'Y'無視されるため、最初のクエリは期待どおりに機能しません。

ここも参照してください: JOIN を使用する場合の WHERE 句と ON

于 2012-09-11T08:36:26.353 に答える