- ベストアンサー
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と同様の出力にするにはどのように結合すればよいのか。(はたまた無謀なのか) 知識不足のため悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。
- みんなの回答 (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") ;
その他の回答 (1)
- Kyouka_M
- ベストアンサー率20% (5/24)
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/psql_k08.htm の、等価結合を参照してみてはいかがでしょうか?
お礼
ありがとうございます。
お礼
回答どうもありがとうございます。 まず、質問にいろいろと不備があったことをお詫びします。 質問した内容はEX1のLEFT JOINで解決しました。 その他特にEX2のNULLを置き換える手法は非常に参考になりました。 ありがとうございます!!