2009-07-24 16 views
0
SELECT 
    a, 
    last_note_user, 
    c, 
    d, 
    iso_src 
FROM 
    X 
    CROSS JOIN Y 
    CROSS JOIN Z 
    LEFT OUTER JOIN W 
     ON W.last_note_user = Z.userid 
      AND W.user_ten = Y.iso_src 

上記のANSIコードIは、ANSIコードなしで同じクエリを与えた場合、875 records.The非ANSIクエリは以下の通りですフェッチされ、私に107件のレコードをフェッチに参加しますANSIとANSIの2つのクエリの違いは何ですか? 上記の質問に答えることで、私を助けてください!Oracleの左外側は

答えて

0

古いANSI構文のOUTER JOINSはあいまいであるため、クエリオプティマイザがこれで何を理解しているかは分かりません。

最初のSQLが正しい行を生成している場合は、ANSIバージョンを忘れて移動してください。

+0

最初のSQLはANSIであり、正しいものです。 Tonyが指摘したように、Oracle固有のバージョンには条件の間違った側に(+)記号が付いています。これが原因です。 –

4

古いスタイルのクエリでは、述語の反対側に(+)記号が付きます。それは次のようにする必要があります:

SELECT 
    a, 
    last_note_user, 
    c, 
    d, 
    iso_src 
FROM 
    X, 
    Y, 
    Z, 
    W 
WHERE 
    W.last_note_user (+) = Z.userid 
    AND W.user_ten (+) = Y.iso_src 

しかし、私はもう古いスタイルの構文を使用しません。

関連する問題