- 締切済み
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
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- o123459876
- ベストアンサー率59% (19/32)
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)
質問です。 DBMSは何でしょうか?ORACLE?ACCESS?その他? (外部結合は表記がことなりますので。) それから、結果のレコード3とレコード4のDATA2は 「????(NULL)」ですか?「BBBBB」でなくて。 書いてあるとおりだとすると、レコード2との違いは何になりますか?
- jamshid6
- ベストアンサー率88% (591/669)
「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の表示方法は本来のデータベースの考え方からは外れている」という点を理解して頂いた方がいいのかもしれません。
お礼
確認しては、みましたがやはり、DATA2の表示方法が本来のデータベースの考えかたから外れている為、あきらめました。これまでの回答感謝します。
補足
明日に確認してみます。回答ありがとうございました。
お礼
DBMSは、DB2です。 結果表の????????は、NULLになります。 レコード2は、TB_Aの2レコード目とTB_Bの1レコード目とTB_Cの2レコード目に該当します。