こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

皆様、ご教授願います。

初めてoracleを利用しているので、ほんとの初心者で
記述の方法がわかりません。
下記の記述でカウントの結果が異なります。
私の中では、同じ結果が得られると思うのですが
どのような違いがあるのでしょうか???

-------------------パターン1-------------------
SELECT
 count(A.SO_CODE)
FROM
 URI_HEAD A,
 KOKUB_FILE B
WHERE
 A.SO_CODE=B.SO_CODE(+)

-------------------パターン2-------------------

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 '%'
ORDER BY
 A.SO_CODE asc

最終的には、パターン2のそれぞれの項目に
条件が入るのですが、テスト段階でまずは、あいまい検索に
してみたのですが。。。
この記述に誤りがあるのでしょうか???

MSSQLやpostgresは使ったことがあるのですが
oracleは初めてなので、SQL文の記述に誤りがあるのか、oracleを利用したときの記述に誤りがあるのか
判断がつかなくて、先に進めません。
教えてください。。。

投稿日時 - 2005-02-23 15:48:40

QNo.1233909

すぐに回答ほしいです

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

>私の中では、同じ結果が得られると思うのですが
>どのような違いがあるのでしょうか???

まず、誤りの是正から..

パターン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 を意味するからです。

投稿日時 - 2005-02-23 23:02:05

お礼

お礼が遅くなり、大変失礼致しました。
開発の納期が迫ってしまい、確認が遅くなりました。

改めまして、ご回答ありがとうございました。

今回は、外部結合ではなく、内部結合をしなければならなかったようです。
目的は誤っていましたが、新しいことが知識が得られて参考になりました。

投稿日時 - 2005-03-04 17:27:52

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(4)

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

投稿日時 - 2005-02-23 17:32:42

お礼

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

投稿日時 - 2005-02-23 18:06:13

ANo.2

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

投稿日時 - 2005-02-23 16:17:52

お礼

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

投稿日時 - 2005-02-23 16:48:57

ANo.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

投稿日時 - 2005-02-23 16:10:27

お礼

Tearissさん
回答ありがとうございます。
さっそく実行してみました。
すると・・・

パターン1の結果より件数が多くなりました。

投稿日時 - 2005-02-23 16:45:58

あなたにオススメの質問