• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:外部結合と抽出条件の指定について)

外部結合と抽出条件の指定について

このQ&Aのポイント
  • 初心者向けのOracleの外部結合と抽出条件の指定方法について質問があります。
  • パターン1とパターン2のSQL文で異なる結果が得られる理由について知りたいです。
  • Oracleを初めて使用するため、記述の誤りがあるのか、Oracleの特殊な記述方法があるのか迷っています。お知恵を拝借できれば幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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 を意味するからです。

MMM-SRV
質問者

お礼

お礼が遅くなり、大変失礼致しました。 開発の納期が迫ってしまい、確認が遅くなりました。 改めまして、ご回答ありがとうございました。 今回は、外部結合ではなく、内部結合をしなければならなかったようです。 目的は誤っていましたが、新しいことが知識が得られて参考になりました。

その他の回答 (3)

  • Azzuri
  • ベストアンサー率68% (34/50)
回答No.3

#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 上記の記述ではどうでしょうか。

MMM-SRV
質問者

お礼

実行した結果、「ORA-01722: 数値が無効です。」と エラーメッセージが表示されました。 A.KYOTEN_CODE B.TAN_CODE この2つはどちらもCHAR型です。

  • Azzuri
  • ベストアンサー率68% (34/50)
回答No.2

外部結合によりBテーブルの方にNULLを含むデータが 存在している可能性があるため、 B.TAN_CODE like '%' によりNULLが検索できず、取得できなくなると思われます。

MMM-SRV
質問者

お礼

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)
回答No.1

あいまい検索の部分で、値が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

MMM-SRV
質問者

お礼

Tearissさん 回答ありがとうございます。 さっそく実行してみました。 すると・・・ パターン1の結果より件数が多くなりました。

関連するQ&A