• ベストアンサー

表の結合について

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 ←データ ポイントは、「どちらかの表にあるデータは全て抽出したい」ということです。 よろしくお願いします。

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

  • ベストアンサー
回答No.1

幹を作って、外部結合。 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(+) ;

amazing
質問者

お礼

ありがとうございました。 この方法で実現することができました。

その他の回答 (4)

回答No.5

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; でも可能です。

amazing
質問者

お礼

回答ありがとうございます。 この方法でもOKですよね。参考になりました。

  • jmh
  • ベストアンサー率23% (71/304)
回答No.4

SELECT * FROM tbl_a FULL OUTER JOIN tbl_b ON (tbl_a.no = tbl_b.no)

amazing
質問者

お礼

回答ありがとうございます。 ただこの方法では、No列が2つできてしまうようでした。

  • fu_u_ka_i
  • ベストアンサー率51% (15/29)
回答No.3

>#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 といったカンジで、いろいろな解決法が存在します。

amazing
質問者

お礼

実現させる為にはいろいろな考え方ができるのですねー。 大変参考になりました。ありがとうございます。

  • mokocho
  • ベストアンサー率14% (1/7)
回答No.2

Select Tbl_A.No,Tbl_A.Str,Tbl_B.Name From Tbl_A,Tbl_B Where Tbl_A.No = Tbl_B.No です。 このあたりはどのSQLでもほとんどかわりません。 ほとんどの市販の参考書にでていますので、一冊買われる事をお勧めいたします。

amazing
質問者

お礼

回答ありがとうございました。 ただ、この方法では両方の表にデータが存在するキーのみ抽出してしまいます。 今回は単純な外部結合だと、どちらかの表に存在するデータしか抽出できなかったので質問させていただきました。 質問ポイントの説明不足だったのかもしれませんね。すみませんでした。