テーブル構造の説明方法がわからないので、これが理にかなっていることを願っています...
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
明確にするために、大文字はテーブルを指し、小文字は主/外部キー列を指します。 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結合によって一部の結果がフィルタリングされました。
だから私はあなたのスキーマを次のように視覚化します:
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サブクエリであり、結合操作をグループ化するだけです。
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
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