- ベストアンサー
表の結合について
2つのテーブルがあります。(それぞれNo列が主キーです) 表A(名称:Tbl_A)に2レコードあります。 No, Str ←列名 10,str_1 ←データ 20,str_2 ←データ 表B(名称:Tbl_B)に2レコードあります。 No, Name ←列名 10,Name_1 ←データ 30,Name_3 ←データ このテーブルを結合して、以下のデータ(3レコード)を抽出するSQL文を教えてください。 No, Str, Name ←列名 10,str_1,Name_1 ←データ 20,str_2,(null) ←データ 30,(null),Name_3 ←データ ポイントは、「どちらかの表にあるデータは全て抽出したい」ということです。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
幹を作って、外部結合。 select a.no,b.str,c.name from (select no from tbl_a union select no from tbl_b) a, tbl_a b, tbl_b c where a.no=b.no(+) and a.no=c.no(+) ;
その他の回答 (4)
- cool_koo1976
- ベストアンサー率50% (40/79)
select Tbl_A.No, Str, Name from Tbl_A, Tbl_B where Tbl_A.No = Tbl_B.No(+) union select Tbl_B.No, Str, Name from Tbl_A, Tbl_B where Tbl_A.No(+) = Tbl_B.No; でも可能です。
お礼
回答ありがとうございます。 この方法でもOKですよね。参考になりました。
- jmh
- ベストアンサー率23% (71/304)
SELECT * FROM tbl_a FULL OUTER JOIN tbl_b ON (tbl_a.no = tbl_b.no)
お礼
回答ありがとうございます。 ただこの方法では、No列が2つできてしまうようでした。
- fu_u_ka_i
- ベストアンサー率51% (15/29)
>#2 >ほとんどの市販の参考書にでていますので、一冊買われる事をお勧めいたします。 貴殿も読んだ方がよい。 というか、質問内容を良く読んだ方がよい。 質問の回答ですが.. 外部結合以外にも、幾つかの解決法が考えられます。 ただし、効率的にどれを選択すべきかは、実行計画で確認し、適切なモノを 選択してください。 例えば、 8i以降のインラインビューを使ってみる。 SELECT A.NO, (SELECT B.STR FROM TBL_A B WHERE A.NO=B.NO) STR, (SELECT C.NAME FROM TBL_B C WHERE A.NO=C.NO) NAME FROM (SELECT NO FROM TBL_A UNION SELECT NO FROM TBL_B) 集計関数で勝負してみる。 SELECT NO,MAX(STR) STR,MAX(NAME) NAME FROM (SELECT NO,STR,NULL AS NAME FROM TBL_A UNION SELECT NO,NULL,NAME FROM TBL_B) GROUP BY NO といったカンジで、いろいろな解決法が存在します。
お礼
実現させる為にはいろいろな考え方ができるのですねー。 大変参考になりました。ありがとうございます。
- mokocho
- ベストアンサー率14% (1/7)
Select Tbl_A.No,Tbl_A.Str,Tbl_B.Name From Tbl_A,Tbl_B Where Tbl_A.No = Tbl_B.No です。 このあたりはどのSQLでもほとんどかわりません。 ほとんどの市販の参考書にでていますので、一冊買われる事をお勧めいたします。
お礼
回答ありがとうございました。 ただ、この方法では両方の表にデータが存在するキーのみ抽出してしまいます。 今回は単純な外部結合だと、どちらかの表に存在するデータしか抽出できなかったので質問させていただきました。 質問ポイントの説明不足だったのかもしれませんね。すみませんでした。
お礼
ありがとうございました。 この方法で実現することができました。