プロが教えるわが家の防犯対策術!

皆様、ご教授願います。

初めて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を利用したときの記述に誤りがあるのか
判断がつかなくて、先に進めません。
教えてください。。。

A 回答 (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 を意味するからです。
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2005/03/04 17:27

#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
上記の記述ではどうでしょうか。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/02/23 18:06

外部結合によりBテーブルの方にNULLを含むデータが


存在している可能性があるため、
B.TAN_CODE like '%'
によりNULLが検索できず、取得できなくなると思われます。
    • good
    • 0
この回答へのお礼

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

あいまい検索の部分で、値が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
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2005/02/23 16:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!