アプリ版:「スタンプのみでお礼する」機能のリリースについて

表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.氏名(+)
では、よけいな行が選択されてしまいます。
なにかよいアイデアはないでしょうか?

A 回答 (3件)

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.氏名(+))

これはどうですか?
    • good
    • 0
この回答へのお礼

残念ながら、ORA-01719エラーになってしまいました。
外部結合しなくて良いならUNIONしなくてもその条件でできますね。
ありがとうございました。

お礼日時:2005/07/04 20:52

>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
;
    • good
    • 0
この回答へのお礼

試してみましたが、ORA-01417(表が少なくとも1 つの他の表に外部結合されている可能性があります。)エラーになってしまいました。でもDECODE関数の使い方がわかったので、他のところで応用してみます。
ありがとうございました。

お礼日時:2005/07/02 22:25

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が見れないのは困るという要望です。説明が足りなくて申し訳ありません。

補足日時:2005/06/30 21:49
    • good
    • 0

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