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

PostgreSQLを使用しております。
それぞれ、TABLE1とTABLE1があり、

TABLE1 a-1   a-2   b-1  
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   1   bbb   aaa   ddd 
    2   ggg   bbb   ccc   
    3   bbb   mmm  ddd  
    4   ggg   mmm  ccc   
:

TABLE2   a-1   a-2        c-1 
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    1   bbb   aaa        eee    
    2   ggg   mmm       qqq   
:

質問1.
TABLE1.a-1=TABLE2.a-1 and TABLE1.a-2=TABLE2.a-2
を条件にして結合 したい場合、どのように結合すればよいのか。

期待結果 a-1   a-2   b-1  c-1 
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   1   bbb   aaa   ddd  eee
   2   ggg   bbb   ccc   ※
   3   bbb   mmm  ddd   ※
   4   ggg   aaa   ccc   qqq
※は空白でもNULLでもよい

質問2.
上記が可能な場合にさらに質問です。
TABLE1およびTABLE2が、SELECT,WHEREによって抽出されたものとした場合、
1つのSQL文で質問1と同様の出力にするにはどのように結合すればよいのか。(はたまた無謀なのか)

知識不足のため悩んでいる状況なので、
どなた様か知識がある方にご教授願いたく思います。

A 回答 (2件)

どこが具体的に分からないのでしょうか?



>期待結果 a-1   a-2   b-1  c-1 
> ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
>   1   bbb   aaa   ddd  eee
>   2   ggg   bbb   ccc   ※
>   3   bbb   mmm  ddd   ※
>   4   ggg   aaa   ccc   qqq
>※は空白でもNULLでもよい

4番目の値を間違っていませんか?

4 ggg mmm ccc qqq  ですよね?

1~4の通番も値として持つのですか?

列名に「-」を使うのですか?
その場合、減算と区別するために、「"」で囲む必要がありますよ?

PostgreSQLのバージョンは何ですか?
あまりに古いと、具体例を提示しても、wanton_dogの環境では実行できないかも知れません。

以下の例は、TABLE1に通番の列(seqno)があるものとします。

-- EX1
-- 簡単なLEFT OUTER JOIN(結合のための列が2個)
select
seqno,
t1."a-1",t1."a-2","b-1","c-1"
from table1 as t1
left join table2 as t2
on t1."a-1"=t2."a-1" and t1."a-2"=t2."a-2"
;

-- EX2
-- EX1のSQLを、nullの場合、値を置き換える
-- nullを判別する関数は複数あったり、RDBMSにより違う。
-- coalesce関数は、主要なRDBMSで実装されている
select
seqno,
t1."a-1",t1."a-2",
coalesce("b-1",'BLANK') as "b-1",
coalesce("c-1",'BLANK') as "c-1"
from table1 as t1
left join table2 as t2
on t1."a-1"=t2."a-1" and t1."a-2"=t2."a-2"
;

-- EX3
-- EX1のSQLを、インラインビューから得る形に変える
select
seqno,
t1."a-1",t1."a-2","b-1","c-1"
from (select * from table1) as t1
left join (select * from table2) as t2
on t1."a-1"=t2."a-1" and t1."a-2"=t2."a-2"
;

-- EX4
-- EX1のSQLを、行値構成子(行値式)を使用する形に変更する。
select
seqno,
t1."a-1",t1."a-2","b-1","c-1"
from table1 as t1
left join table2 as t2
on (t1."a-1",t1."a-2")=(t2."a-1",t2."a-2")
;
    • good
    • 0
この回答へのお礼

回答どうもありがとうございます。
まず、質問にいろいろと不備があったことをお詫びします。

質問した内容はEX1のLEFT JOINで解決しました。
その他特にEX2のNULLを置き換える手法は非常に参考になりました。

ありがとうございます!!

お礼日時:2008/08/20 21:14

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd …
の、等価結合を参照してみてはいかがでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2008/08/20 21:15

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