- ベストアンサー
固定値を含む結合と複数テーブルの結合について
- 固定値を含む結合とは、外部結合の一種であり、LEFT JOINやRIGHT JOINを使用して、固定値を含めた結果を取得する方法です。
- 複数テーブルの結合とは、2つ以上のテーブルを結合する方法であり、主キーと外部キーを使用して関連付けられたデータを取得することができます。
- LEFT JOINやRIGHT JOINでは、固定値を含めた結合を行うことができず、(+)演算子を使用する必要があります。複数テーブルの結合でも同様に(+)演算子を使用することができますが、副参照を使用する方法もあります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
話が抽象的すぎて何を答えれば良いのか分からない・・・・ 「エラーになってしまいます。」が指す意味が分かりづらいですね。ORA-xxxxxが発生するのか、意図したレコードが抽出されないのか。もう少し具体的に書くと良いでしょう。また、その際に2テーブルの列定義(抜粋でも)やSQLのON句などは書かないと回答はつかないでしょうね。 Oracleの10g以降を使用しているのであればもはや(+)を使う理由はありません。LEFT JOINを使うべきです。 ところで、外部結合において良くある間違いとして以下のようなSQLがあります。ID列とNAME列があるテーブルA、Bがあり、 SELECT A.ID, B.ID, B.NAME FROM A LEFT JOIN B ON A.ID = B.ID AND B.NAME = 'テスト' というSQLを発行するとします。これは外部結合が全く意味をなさないSQLになります。これは SELECT A.ID, B.ID, B.NAME FROM A LEFT JOIN B ON A.ID = B.ID AND 'テスト' = B.NAME というSQLでないといけません。つまり、LEFT JOINのON句に指定される結合条件は、外部結合されるBが全て右側に来なくてはいけません。初歩的ですがありがちなミスなので覚えておくと良いでしょう。また、場合によってはB側をサブクエリーにするというテクニックが適用できる事もあります。 SELECT A.ID, B.ID, B.NAME FROM A LEFT JOIN (SELECT * FROM B WHERE NAME = 'テスト') B ON A.ID = B.ID
その他の回答 (1)
- yamada_g
- ベストアンサー率68% (258/374)
回答についてはNo.1さんのおっしゃるとおりなのですが、 >ところで、外部結合において良くある間違いとして以下のようなSQLがあります。・・ というのはどういうことでしょうか? たとえば with a as ( select 1 id from dual union all select 2 id from dual ) ,b as ( select 1 id ,'テスト' name from dual union all select 2 id ,'' name from dual) select a.id aid,b.id bid,b.name from a left join b on a.id = b.id and b.name = 'テスト'; とした場合、 AID BID NAME 1 1 "テスト" 2 "" "" となりますが、これは >外部結合が全く意味をなさないSQL なのでしょうか? 自分としては正しい外部結合になっていると思うのですが。 oracle10.2.0.1.0で確認しました。 便乗質問で申し訳ありませんが教えていただけたら幸いです。
お礼
回答ありがとうございます。今は >サブクエリーにするというテクニック これで対処してるって状態です。 >A.ID = B.ID >AND >'テスト' = B.NAME 正直どっちに固定値を書いたか記憶がないんですよね。 順番が逆だとエラーになるんでしょうか? それとも単純に書き間違えたのかな…。 とりあえず、会社じゃないと確認出来ないんで来週確認してみます。
補足
単に間違ってただけでしたorz 言われた通りにやったら上手くいきました ありがとうございます