9

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

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
4

4 に答える 4

10

したがって、スキーマを次のように視覚化します。

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

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

于 2010-09-15T21:02:15.913 に答える
2

明確にするために、大文字はテーブルを指し、小文字は主/外部キー列を指します。おそらく 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 結合によって一部の結果がフィルタリングされました。

于 2010-09-27T19:54:12.010 に答える
1
 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
于 2010-09-15T20:53:48.857 に答える
0
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
于 2010-09-15T21:00:12.390 に答える