- 締切済み
条件付き外部結合について
表A:ID、氏名 表B:ID、氏名 の2表を結合したいのですが、条件が 1.BのID <> 0 のときはIDで結合 2.BのID = 0 のときは氏名で結合 3.マッチしない、Bに存在しない場合はAのみ表示 となっています。 SELECT A.ID,A.氏名,B.ID,B.氏名 FROM A,B WHERE A <> 0 AND A.ID = B.ID(+) UNION SELECT A.ID,A.氏名,B.ID,B.氏名 FROM A,B WHERE A = 0 AND A.氏名 = B.氏名(+) では、よけいな行が選択されてしまいます。 なにかよいアイデアはないでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- jch
- ベストアンサー率38% (7/18)
SELECT A.ID,A.氏名,B.ID,B.氏名 FROM A,B WHERE (B.ID <> '0' AND A.ID = B.ID(+)) OR (B.ID = '0' AND A.氏名 = B.氏名(+)) これはどうですか?
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
>select A.ID,A.氏名,B.ID,B.氏名 >from A,B >where >DECODE(A,0,DECODE(A.ID,B.ID(+),1,0),DECODE(A.氏名,B.氏名(+),1,0))=1 >; 真偽判定が逆ですね。 select A.ID,A.氏名,B.ID,B.氏名 from A,B where DECODE(A.ID,0,DECODE(A.氏名,B.氏名(+),1,0),DECODE(A.ID,B.ID(+),1,0))=1 ;
お礼
試してみましたが、ORA-01417(表が少なくとも1 つの他の表に外部結合されている可能性があります。)エラーになってしまいました。でもDECODE関数の使い方がわかったので、他のところで応用してみます。 ありがとうございました。
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
select A.ID,A.氏名,B.ID,B.氏名 from A,B where DECODE(A,0,DECODE(A.ID,B.ID(+),1,0),DECODE(A.氏名,B.氏名(+),1,0))=1 ; というような条件式を書くことで、お望みの結合になるような気がしますが.. 検証されているデータで、Bの氏名がユニークでないがために、表Aの1つレコードに 複数の表Bのレコードが結合され、重複しているように思います。 なので、投稿にあるSQLも私の書いたSQLも同じものを返すような気がしますし、 それが条件に見合う正しい結果だと思います。 言い換えれば、結合条件として書かれた3つの条件が適切でないように感じます。
補足
すみません、自宅なのでご提示のSQLは試せていませんが… 実際には、表A,表Bにはそれぞれ別の観点からの「評価」という項目があり、それを並べて見たいという要望なのです。表Bはご指摘のとおり完全ではないので、できる限り名寄せをしたい、でもBがないからAが見れないのは困るという要望です。説明が足りなくて申し訳ありません。
お礼
残念ながら、ORA-01719エラーになってしまいました。 外部結合しなくて良いならUNIONしなくてもその条件でできますね。 ありがとうございました。