• ベストアンサー

SQL 複数条件を設定

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と同様の出力にするにはどのように結合すればよいのか。(はたまた無謀なのか) 知識不足のため悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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") ;

wanton_dog
質問者

お礼

回答どうもありがとうございます。 まず、質問にいろいろと不備があったことをお詫びします。 質問した内容はEX1のLEFT JOINで解決しました。 その他特にEX2のNULLを置き換える手法は非常に参考になりました。 ありがとうございます!!

その他の回答 (1)

  • Kyouka_M
  • ベストアンサー率20% (5/24)
回答No.1

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/psql_k08.htm の、等価結合を参照してみてはいかがでしょうか?

wanton_dog
質問者

お礼

ありがとうございます。