• 締切済み

3つ以上の外部結合から抽出するSQL構文

次の3つのTABLEから期待する結果(結果を参照)を導きたいのですがJOIN等を使用しても期待と異なります。SQLを教えて下さい。結果は、SELECTでもVIEWでも構いません。一つのSQLでなくても構いません。 ●テーブル構成 テーブル名 - TB_A- -----TB_B--- ----TB_C----         ------ ------------- ------------- 列名     EMPNO EMPNO DATA1 EMPNO DATA2 レコード1   000001 000002 AAAAA 000001 AAAAA レコード2   000002 000002 BBBBB 000002 BBBBB レコード3   000003 000002 CCCCC 000003 CCCCC ●結果 列名     EMPNO DATA1 DATA2 レコード1   000001 ???????? AAAAA レコード2   000002 AAAAA BBBBB レコード3 000002 BBBBB ???????? レコード4   000002 CCCCC ???????? レコード5   000003 ???????? CCCCC

みんなの回答

回答No.3

select a.EMPNO as EMPNO    ,b.DATA1 as DATA1    ,case when b.DATA1 >= c.DATA2        then null        else c.DATA2      end as DATA2 from tb_a a left outer join tb_b b   on a.EMPNO = b.EMPNO left outer join tb_c c   on a.EMPNO = c.EMPNO order by EMPNO,DATA1 --------結果----------- EMPNO  DATA1  DATA2 000001         AAAAA 000002   AAAAA  BBBBB 000002   BBBBB 000002   CCCCC 000003         CCCCC

  • seiiiichi
  • ベストアンサー率41% (79/190)
回答No.2

質問です。 DBMSは何でしょうか?ORACLE?ACCESS?その他? (外部結合は表記がことなりますので。) それから、結果のレコード3とレコード4のDATA2は 「????(NULL)」ですか?「BBBBB」でなくて。 書いてあるとおりだとすると、レコード2との違いは何になりますか?

kakusan1
質問者

お礼

DBMSは、DB2です。 結果表の????????は、NULLになります。 レコード2は、TB_Aの2レコード目とTB_Bの1レコード目とTB_Cの2レコード目に該当します。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

「DBMSの種類やテーブルの構造(主キー、データの入り方)を示さないで質問した結果がどの程度的外れな回答を招くか」の例みたいになってしまいそうですが。 -- ROW_NUMBERの使えるDBMSの場合 SELECT tmp.EMPNO, tmp.DATA1, c.DATA2 FROM (SELECT a.EMPNO, b.DATA1, ROW_NUMBER() OVER (PARTITION BY a.EMPNO ORDER BY b.DATA1) SEQ FROM TB_A a LEFT OUTER JOIN TB_B b ON b.EMPNO=a.EMPNO ) tmp LEFT OUTER JOIN TB_C c ON c.EMPNO=tmp.EMPNO AND tmp.SEQ=1 -- ROW_NUMBERの使えないけど、相関サブクエリの使えるDBMSの場合 SELECT tmp.EMPNO, tmp.DATA1, c.DATA2 FROM (SELECT a.EMPNO, b.DATA1, (SELECT MIN(DATA1) FROM TB_B WHERE EMPNO=a.EMPNO) MINDATA1 FROM TB_A a LEFT OUTER JOIN TB_B b ON b.EMPNO=a.EMPNO ) tmp LEFT OUTER JOIN TB_C c ON c.EMPNO=tmp.EMPNO AND (tmp.DATA1=tmp.MINDATA1 OR tmp.DATA1 IS NULL) 書かれたサンプルデータに対しては間違いなく想定した結果を返します。 しかし、TB_BやTB_Cに他のパターンのデータがあった場合に想定した結果を返す保証はありません。 なぜなら上記が正常に結果を返す条件は ・TB_A, TB_CのEMPNOがユニークであること ・TB_Bの(EMPNO,DATA1)がユニークであること ・TB_Cのデータを結合する対象はTB_Bが複数あるケースではDATA1が最も小さいものであること どちらかというと、「DATA2の表示方法は本来のデータベースの考え方からは外れている」という点を理解して頂いた方がいいのかもしれません。

kakusan1
質問者

お礼

確認しては、みましたがやはり、DATA2の表示方法が本来のデータベースの考えかたから外れている為、あきらめました。これまでの回答感謝します。

kakusan1
質問者

補足

明日に確認してみます。回答ありがとうございました。

関連するQ&A