- ベストアンサー
外部結合と抽出条件の指定について
- 初心者向けのOracleの外部結合と抽出条件の指定方法について質問があります。
- パターン1とパターン2のSQL文で異なる結果が得られる理由について知りたいです。
- Oracleを初めて使用するため、記述の誤りがあるのか、Oracleの特殊な記述方法があるのか迷っています。お知恵を拝借できれば幸いです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>私の中では、同じ結果が得られると思うのですが >どのような違いがあるのでしょうか??? まず、誤りの是正から.. パターン2のSQLのWHERE句に書かれた B.TAN_CODE like '%' は、 B.TAN_CODE(+) like '%' でなければいけません。 そうでないと、正しい外部結合がされません。 次に、件数の相違ですが、正しい外部結合式を書いたパターン2の件数は select count(A_SO_CODE) from URI_HEAD where KYOTEN_CODE is NULL; で返される件数分だけ、パターン1と違うはずです。 A.KYOTEN_CODE like '%' は、暗黙的に is not null を意味するからです。
その他の回答 (3)
- Azzuri
- ベストアンサー率68% (34/50)
#2です。 SELECT count(A.SO_CODE) FROM URI_HEAD A, KOKUB_FILE B WHERE A.SO_CODE=B.SO_CODE(+) AND NVL(TO_CHAR(A.KYOTEN_CODE),'') like '%' AND NVL(TO_CHAR(B.TAN_CODE),'') like '%' ORDER BY A.SO_CODE asc 上記の記述ではどうでしょうか。
お礼
実行した結果、「ORA-01722: 数値が無効です。」と エラーメッセージが表示されました。 A.KYOTEN_CODE B.TAN_CODE この2つはどちらもCHAR型です。
- Azzuri
- ベストアンサー率68% (34/50)
外部結合によりBテーブルの方にNULLを含むデータが 存在している可能性があるため、 B.TAN_CODE like '%' によりNULLが検索できず、取得できなくなると思われます。
お礼
Azzuriさん ご回答ありがとうございます。 こういうことなのかなと思い、パターン3で実行してみましたが、件数はパターン1と合致しませんでした(ノ_・。) SELECT count(A.SO_CODE) FROM URI_HEAD A, KOKUB_FILE B WHERE A.SO_CODE=B.SO_CODE(+) AND A.KYOTEN_CODE like '%' AND (B.TAN_CODE like '%' or B.TAN_CODE is NULL) ORDER BY A.SO_CODE asc
- Teariss
- ベストアンサー率30% (3/10)
あいまい検索の部分で、値がNullのレコードが省かれるため、パターン2のSQLの結果の方が件数が少なくなると思います。 以下のSQLならパターン1と同じになると思います。 SELECT count(A.SO_CODE) FROM URI_HEAD A, KOKUB_FILE B WHERE A.SO_CODE=B.SO_CODE(+) AND (A.KYOTEN_CODE like '%' or A.KYOTEN_CODE is NULL) AND (B.TAN_CODE like '%' or B.TAN_CODE is NULL) ORDER BY A.SO_CODE asc
お礼
Tearissさん 回答ありがとうございます。 さっそく実行してみました。 すると・・・ パターン1の結果より件数が多くなりました。
お礼
お礼が遅くなり、大変失礼致しました。 開発の納期が迫ってしまい、確認が遅くなりました。 改めまして、ご回答ありがとうございました。 今回は、外部結合ではなく、内部結合をしなければならなかったようです。 目的は誤っていましたが、新しいことが知識が得られて参考になりました。