dポイントプレゼントキャンペーン実施中!

こんにちは、外部結合の仕方についてお聞きしたいのですが、

この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]

A 回答 (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
    • good
    • 0

うまくいかないというのは具体的にどうなるのでしょうか。


記載の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のバージョンも明記した方がいいですよ。
    • good
    • 0

( ) を忘れているように思います。



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 条件式

通常、上のような構文にしたがっていないとうまく処理されません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す