web-dev-qa-db-ja.com

2つ以上のテーブルで外部結合を行う方法(Oracle)

テーブル構造の説明方法がわからないので、これが理にかなっていることを願っています...

AがBに対して1対多の関係を持ち、次にCと1対多の関係を持つように階層関係にある3つのテーブルがあります。トリックは、BとCの外部キーをnull(つまり、親なし)にできることです。定義済み)。私はまた、A、B、またはCとは関係のないDとEを持っています(直接)。

最後に、C、D、およびEとの多対1の関係を持つ結合テーブルであるFがあります。そのフィールド(他のテーブルへのFK)はnull許容されません。

1つの結果セット内のすべてのテーブルを結合するSQLステートメントを記述したいと思います。 Bに子があり、BとCに類似しているかどうかに関係なく、すべてのAを返す必要があるため、外部結合を使用する必要があることはわかっています。

質問1: ANSI外部結合構文(以前はOracle "(+)"のみを使用しました)を調べましたが、外部結合が3つ以上のテーブルである例を見つけることができません。誰かが例を提供/指摘できますか?

質問2:結合テーブルFに基づいてテーブルDおよびEのレコードを含めることは可能ですか?もしそうなら、これは外部結合で行われますか?

ありがとう!

[〜#〜]編集[〜#〜]

もちろん、これを投稿した直後に、質問1に答える例を見つけました。しかし、質問2はまだ私を困惑させています。

例:

         SELECT A.a,
                B.b,
                C.c
           FROM A
FULL OUTER JOIN B ON B.a = A.a
FULL OUTER JOIN C ON C.b = B.b
9
sdoca

明確にするために、大文字はテーブルを指し、小文字は主/外部キー列を指します。 Quassnoiと同じように書くべきだったと思いますが、それが始まったのでこれを続けます。

このSQLは、私が探している結果を返します。

         SELECT A.a,
                B.b,
                C.c,
                D.d,
                E.e
           FROM A
FULL OUTER JOIN B ON B.a = A.a
FULL OUTER JOIN C ON C.b = B.b
FULL OUTER JOIN F ON F.c = C.c
FULL OUTER JOIN D ON D.d = F.d
FULL OUTER JOIN E ON E.e = F.e

BillのようにSQLを設定しようとしましたが、LEFT結合の代わりにFULL結合を使用しましたが、私のものと同じ結果が返されませんでした。彼のSQLを完全に理解しているとは言えませんが、INNER結合によって一部の結果がフィルタリングされました。

2
sdoca

だから私はあなたのスキーマを次のように視覚化します:

A --o< B --o< C --< F >-- D
                      >-- E

確かに複数の結合を行うことができます。また、算術式をグループ化するのと同じように、結合式を括弧でグループ化することもできます。

SELECT ...
FROM A LEFT OUTER JOIN (
  B LEFT OUTER JOIN (
    C LEFT OUTER JOIN (
      F INNER JOIN D ON D.d = F.d
        INNER JOIN E ON E.e = F.e
      ) ON C.c = F.c
    ) ON B.b = C.b
) ON A.a = B.a

これらの括弧はnotサブクエリであり、結合操作をグループ化するだけです。

10
Bill Karwin
 select a.*, b.*, c.*
 from a
 left outer join b on a.b_id = b.id
 left outer join c on a.c_id = c.id

さて、そこにD、E、Fを入れるのは難しくなります。

select c.*, d.*, e.*
from C
inner join f on c.id = f.c_id
inner join d on d.id = f.d_id
inner join e on d.id = f.e_id

次に、すべてをまとめます。

 select a.*, b.*, cde.*
 from a
 left outer join b on a.b_id = b.id
 left outer join 
 (select c.id as c_id, c.*, d.*, e.*
   from C
   inner join f on c.id = f.c_id
   inner join d on d.id = f.d_id
   inner join e on d.id = f.e_id) CDE
 on a.c_id = cde.c_id
1
James Curran
SELECT  a.*, b.*, c.*, d.*, e.*
FROM    a
LEFT JOIN
        b
ON      b.a = a.id
LEFT JOIN
        с
ON      c.b = b.id
LEFT JOIN
        f
ON      f.с = c.id
LEFT JOIN
        d
ON      d.id = f.d
LEFT JOIN
        e
ON      e.id = f.e
0
Quassnoi