複数の外部結合の仕方について

このQ&Aのポイント
  • 外部結合時のON句の書き方について質問です。
  • SQL1で抽出されたデータにTABLE3のデータを追加するためにSQL2を作成しましたが、うまくいきません。
  • ON TABLE1.[Code]=TABLE3.[Code]の部分をどのように記述すれば良いでしょうか?
回答を見る
  • ベストアンサー

複数の外部結合

こんにちは、外部結合の仕方についてお聞きしたいのですが、 このSQL1で抽出されたデータにさらに TABLE3テーブルのデータを追加したくSQL2を作成したのですが、 うまくいきません。 ON TABLE1.[Code]=TABLE3.[Code]の部分をどのように記述すればよいのでしょうか? SQL1--------- TABLE1.[tamp] [Child], TABLE2.* FROM [p].[Price] TABLE1 LEFT OUTER JOIN [p].[Receive] TABLE2 ON TABLE2.[Code]=TABLE1.[Code] SQL2---------- TABLE1.[tamp] [Child], TABLE2.*, TABLE3.* FROM [p].[Price] TABLE1 LEFT OUTER JOIN [p].[Receive] TABLE2 ON TABLE2.[Code]=TABLE1.[Code] LEFT OUTER JOIN [p].[Product] TABLE3 ON TABLE1.[Code]=TABLE3.[Code]

  • Oracle
  • 回答数3
  • ありがとう数2

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

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

気になったので見直してみたら、微妙に違っていました。すみませんでした。 ・LEFT OUTER JOIN は、左から右に評価されるようです。 ・ON の結合条件は、 ( ) で囲みます。(データベースソフトのSQL解析器によっては省略しても動作することが期待できますが、 ( ) で囲むのが可読性的にもいいと思います) というわけで、 FROM 句を修正するとうまくいくかもしれません。 FROM [p].[Price] TABLE1 LEFT OUTER JOIN [p].[Receive] TABLE2 ON (TABLE2.[Code]=TABLE1.[Code]) LEFT OUTER JOIN [p].[Product] TABLE3 ON (TABLE1.[Code]=TABLE3.[Code]) ところで、なぜ下のように結合しているのですか? Price -< Receive -< Product 下のようになる気がするのですが・・・? 私の勘違いでしょうか? Receive -< Product -< Price

その他の回答 (2)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

うまくいかないというのは具体的にどうなるのでしょうか。 記載のSQLだけを見る限りは別におかしくはないと思います。 たとえば、 with ta as ( select '1' code, '11' value from dual --3テーブル全部あり union all select '2' code, '22' value from dual --ta,tbのみ union all select '3' code, '33' value from dual --ta,tcのみ union all select '4' code, '44' value from dual) --taのみ ,tb as ( select '1' code, '111' value from dual union all select '2' code, '222' value from dual) ,tc as ( select '1' code, '1111' value from dual union all select '3' code, '3333' value from dual) --ここからSELECT本体 select * from ta table1 left join tb table2 on table1.code = table2.code left join tc table3 on table1.code = table3.code order by table1.code; というSQLの場合、 code value code_1 value_1 code_2 value_3 1 11 1  111 1  1111 2 22 2  222 null null 3 33 null null 3  3333 4 44 null null null null となります。期待通りの結果です。 各テーブルのデータと期待する結果、現状の結果を記載した方が分かりやすいと思います。 また、Oracleのバージョンも明記した方がいいですよ。

回答No.1

( ) を忘れているように思います。 SQL2---------- TABLE1.[tamp] [Child], TABLE2.*, TABLE3.* FROM ( [p].[Price] TABLE1 LEFT OUTER JOIN [p].[Receive] TABLE2 ON TABLE2.[Code]=TABLE1.[Code] ) LEFT OUTER JOIN [p].[Product] TABLE3 ON TABLE1.[Code]=TABLE3.[Code] FROM (テーブル名 LEFT OUTER JOIN テーブル名 ON 条件式) LEFT OUTER JOIN テーブル名 ON 条件式 通常、上のような構文にしたがっていないとうまく処理されません。

関連するQ&A

  • SQL 外部結合について

    EXCELでODBC接続で外部データを取り込み、クエリテーブルを作成するところまではできるのですが、MicrosoftQueryを使って外部結合をしようとすると、テーブルが3個以上ある場合は外部結合できませんとエラーが表示されます。 直接SQLをさわれば出来るのかと思い、 SELECT フィールド名1, フィールド名2, ... FROM (((TABLE1 LEFT JOIN TABLE2 ON TABLE1.NO = TABLE2.NO)LEFT JOIN TABLE3 ON TABLE1.NO = TABLE3.NO)LEFT JOIN TABLE4 ON TABLE1.NO = TABLE4.NO)LEFT JOIN TABLE5 ON TABLE1.NO = TABLE5.NO を入力したのですが、「ORA-00942: 表またはビューが存在しません」というエラーが発生しました。 いろいろ調べてみたのですが全くの初心者なもので本当に困っております。 どなたかアドバイス等よろしくお願いします。

  • LEFT OUTER 外部結合で一致しない値も表示

    select table1.*, table2.no from table1 inner left outer join table2 on table1.id = table2.no 上記の文を使って、一致した値がなくても、 すべて表示させた表を完成させたいのですが、 エラー #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'left outer join table2 on table1.id = table2.no~ が出てしまいます。 何がいけないのか、LEFT OUTERなしでやってみると、 きちんと値が返ってきました。 詳しい方いらっしゃいましたら、どうかお知恵を貸してください。 お願いいたします。

    • ベストアンサー
    • MySQL
  • 複数テーブルを結合するには?

    OS:WINDOWSXP SP2 ORACLE:Oracle9i Enterprise Edition Release 9.2.0.1.0 A, B, Cというテーブルがあるとします。 それぞれのテーブルには XXカラムと YYカラムがあるとします。 2つのテーブルを結合させるには、以下のSQL文を記述すれば良いと考えています。 SELECT A.*,B.* FROM A JOIN B ON A.XX = B.XX 3つのテーブルを結合するには、以下のSQL文を記述しています。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX JOIN C ON A.XX = C.XX 但し、この記述方法でいきますと、Cテーブルを右側外部結合に指定した場合のみ、 ORA-00904 "C" 無効な識別子です。 というエラーメッセージが表示されます。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX RIGHT OUTER JOIN C (←LEFT OUTER、FULL OUTER)なら通ります) ON A.XX = C.XX 何故、右側外部結合のみ不正となるのか不明であり、解決策が見つかりません。 複数のテーブルを結合する為のSQL文の記述方法を教えて頂けますでしょうか?

  • 結合SQLに関して

    結合SQLに関して ある3つのテーブルが存在し、TABLE1の情報を核として、TABLE2,TABLE3と 結合させて情報を取得しようと考えています。 TABLE1とTABLE2だけであれば LEFT OUTER JOIN等を駆使すれば、TABLE1を核として 全件表示可能かと思いますが、TABLE3も含めて結果のような形にしたい場合は、 どのようにSQLを記述すれば良いでしょうか。。。。 初歩的な質問で申し訳ありませんが、教えて下さい。 TABLE1 NO 1 2 3 TABLE2 NO,BUSYO_CODE 1,123 2,123 3,456 TABLE3 BUSYO_CODE,BUSYO_NAME 123,総務 456,経理 結果 NO,BUSYO_CODE,BUSYO_NAME 1,123,総務 2,123,総務 3,456,経理 よろしくお願いします。

  • テーブルの結合について質問です。

    テーブルの結合について質問です。 テーブル名:SHOSAI SELECT T1.TIMESTAMP AS 登録, T1.UPDATE AS 更新, T2.CONTENT AS コード, . . . FROM SHOSAI T1 LEFT OUTER JOIN X_CODE T2 ON T1.Y_CODE = T2.CODE テーブル名:SHOSAI SELECT T1.TIMESTAMP AS 登録, T1.UPDATE AS 更新, T2.CONTENT AS コード, T1.BANGO AS 番号, T3.CONTENT AS 曜日, . . . FROM JOHO T1 LEFT OUTER JOIN X_CODE T2 ON T1.Y_CODE = T2.CODE LEFT OUTER JOIN H_CODE T3 ON T1.J_CODE = T3.CODE . . . この2つのテーブルを結合したいのですが それぞれのデータ数が300あり SELECT*で呼びだしてもCSEはエラーとなってしまいます。 項目名を選定してプログラムを組んでもうまくできません。 良い方法があれば教えてください。

    • ベストアンサー
    • MySQL
  • 3テーブル外部結合方法について

    3つのテーブルを外部結合したいのですが・・・、 こんがらがってしまいました。 A,B,Cの3テーブルがあり、A,B,Cの順に外部結合 (LEFT OUTER JOIN)したいのですが、 A,BのテーブルについてはWhere句の条件指定が 必要です。 Select From (Select AA.a From A AA Where b = xxxx) BB Left Outer Join (Select CC.b From B CC Where c = eeee and BB.a = CC.b) On ???? こんな感じでつまづいてしまいました・・・

  • 固定値を含む結合と複数テーブルの結合について

    「1.固定値を含む結合」と「2.複数テーブルの結合」について教えて下さい。 最近oracleを使い始めてSQLで表の結合を書く場面があるんですが LEFT(RIGHT) JOIN を使うのか、(+)を使って書くのかで迷っています。 LEFT(RIGHT) JOINだと固定値を含めて外部結合しようとするとエラーになってしまいます。 それが嫌で(+)を使っていたんですが 今度は複数のテーブルを(+)で結合しようとするとエラーになってしまいます。 (AテーブルとBテーブル、AテーブルとCテーブルなど?) こういう場合はどうすれば良いのでしょうか? とりあえず副参照をFROMに指定して対処してるんですが 何かきちんとした書き方があるのでしょうか?誰か教えて下さい。

  • Accessで外部結合

    本来Access2002(+VB.NET2003)で開発しています。 Accessで外部結合したいのですが出来ません。 わからなかったので、Oracle10gExpressionEdutionで試してみました。 SQL> desc DVDデータ 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- DVDナンバー NOT NULL VARCHAR2(10) 収録ID1 VARCHAR2(6) 収録ID2 VARCHAR2(6) 収録ID3 VARCHAR2(6) 収録ID4 VARCHAR2(6) ワイドホワイト NUMBER(1) 焼込済 NUMBER(1) レーベルプリント済 NUMBER(1) バックアップ NUMBER(1) SQL> desc 収録データ 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- 収録ID NOT NULL VARCHAR2(6) 番組名 VARCHAR2(100) 収録日 DATE 収録ステータス NUMBER(1) メモ VARCHAR2(100) のテーブル構造で select d.DVDナンバー , decode(d.ワイドホワイト , 0 , 'TRUE' , 1 , 'False' ), s.番組名 , s.収録日 , s2.番組名 , s2.収録日 , s3.番組名 , s3.収録日 , s4.番組名 , s4.収録日 from DVDデータ d join 収録データ s on s.収録ID = d.収録ID1 left outer join 収録データ s2 on s2.収録ID = d.収録ID2 left outer join 収録データ s3 on s3.収録ID = d.収録ID3 left outer join 収録データ s4 on s4.収録ID = d.収録ID4 order by 1 asc; をAccess2002のクエリで作成したいのですが、出来ません。 ※2行目のDecodeはAccessでは使えないので、 select d.DVDナンバー , d.ワイドホワイト, s.番組名 , s.収録日 , s2.番組名 , s2.収録日 , s3.番組名 , s3.収録日 , s4.番組名 , s4.収録日 from DVDデータ d join 収録データ s on s.収録ID = d.収録ID1 left outer join 収録データ s2 on s2.収録ID = d.収録ID2 left outer join 収録データ s3 on s3.収録ID = d.収録ID3 left outer join 収録データ s4 on s4.収録ID = d.収録ID4 order by d.DVDナンバー asc; ですかね。 Accessで上手く表示できるようにするにはどうしたらよいのでしょうか

  • テーブル結合で、結合フィールドをWHERE句に用いた時に、結合フィールドのデータがNULLになってしまう。

    MySQL 4.0.24-standard + PHP Version 4.3.11 を使用しています。 下記のような table_a, table_b があり、idフィールドで外部結合させています。 table_a id|value ------- 1 | 0 2 | 1 table_b id|name ------- 1 | A 2 | B SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b; result id|value|name -------------- 1 | 0 | A 2 | 1 | B しかし、下記のクエリでは、このようにidがNULLになってしまいます。 SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b WHERE table_a.id = 1; result id |value|name -------------- NULL| 0 | A 以下のような結果を得たいのですが、どうすれば良いのでしょうか? result id|value|name -------------- 1 | 0 | A

    • ベストアンサー
    • MySQL
  • SQL文の変換(Oracle→MySQL)結合句

    OracleからMySQLへSQL文を変換するにあたり、 テーブル結合部分が複数ありややこしくて以下で合っているのか、分かる方いましたらご教授ください。 ■Oracle  SELECT *  FROM m, h, p, c  WHERE m.mid = h.mid(+)  AND m.tcd = '0'  And h.pid = p.pid(+)  And m.rcd = c.rcd  And c.cid = 'aaa' ■MySQL  SELECT *  FROM m left outer join h on m.mid = h.mid and m.tcd = '0'     h left outer join p on h.pid = p.pid     m left inner join c on m.rcd = c.rcd and c.cid = 'aaa'

    • ベストアンサー
    • MySQL