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

テーブル結合について、下記SQLをANSI結合の書き方で表したい。

select *
from
(select key from A
union
select key from B
union
select key from C) X,
A,B,C
where X.key=A.key(+) and X.key=B.key(+) and X.key=C.key(+)

このSQLをANSI結合の記述で書きたいのですが、
(+)での結合文になれておらず試行錯誤しております。
下記のようなのかなとは模索しておりますが、
手元に実行環境がなくわかりません。
また、要所気付く点などありましたら、ご指摘願います。

select A.*, B.*, C.*
from
(select key from A
union
select key from B
union
select key from C) X,
LEFT JOIN A
ON X.key=A.key
LEFT JOIN B
ON X.key=B.key
LEFT JOIN C
ON X.key=C.key

A 回答 (3件)

敢えていうなら、Xの後のカンマが不要です。



select *
from
(select key from A
union
select key from B
union
select key from C) X
LEFT JOIN A ON X.key=A.key
LEFT JOIN B ON X.key=B.key
LEFT JOIN C ON X.key=C.key

Aテーブルのkey、Bテーブルのkey、Cテーブルのkeyが重複する可能性があり、
keyが重複する場合は、単純横展開ではなく、1行にしたいという条件であれば、
(+)を単純にLEFT OUTER JOINにするだけで良いと思います。
    • good
    • 1
この回答へのお礼

ありがとうございます
無事レコードに重複せず参照できました

お礼日時:2010/04/14 20:12

>aテーブルでジョイントする理由は1レコード単位での


>抽出としたいがためです大変参考になりました
>ありがとうございます

横展開したいだけならUNIONで項目をずらしていけばいいのではないでしょうか。

select key as A_key, null as B_key, null as C_Key from A
union
select null as A_key, key as B_key, null as C_Key from B
union
select null as A_key, null as B_key, key as C_Key from C

前提条件をはっきりしていただけると、もう少しピンポイントで回答できるとおもいます。
    • good
    • 0

構文的にはあっているようですが,


A、B、CをUNIONしたXとさらにA、B、Cとジョインする意味はないと思います。

単純にX内のAと外のAは別テーブルなのか、X内のA、B、Cを外で参照できると勘違いしているのか、X内のAと外のAに意味はないのかはっきりさせてください。

()内でUNIONした者はXという別名がついているのでX.keyと指定しないと参照出来ません。
    • good
    • 0
この回答へのお礼

この質問より前につまづいていた
問題があるのですが
下記の方の質問と似ていることから
このsql文を参照しました

その為再度aテーブルでジョイントする
理由は1レコード単位での
抽出としたいがためです大変参考に
なりました
ありがとうございます

大戦

お礼日時:2010/04/14 12:57

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

関連するカテゴリからQ&Aを探す