2

また、データベース テーブルを結合する方法について質問があります。私のデータ設定は次のとおりです。

MainTable
main_id x y z
1       l m n
2       o p q
SubTableA
main_id extra_id foo bar
1       a        1   4
1       b        2   h
1       c        1   g
2       a        k   er
2       b        k   34
2       c        l   f

SubTableB
main_id extra_id a b c
1       a        v r j
1       c        w r k
2       c        x h l

SubTableC
main_id extra_id mono stereo
2       c        n    null
2       d        z    y

私は次の結果を達成しようとしています:

main_id x y z extra_id foo bar a b c mono stereo
1       l m n a        1   4   v r j null null
1       l m n b        2   h         null null
1       l m n c        1   g   w r k null null
2       o p q a        k   er        null null
2       o p q b        k   34        null null
2       o p q c        l   f   x h l n    null
2       o p q d                      z    y

物事を盛り上げるために、extra_idnull であるか、サブテーブルの 1 つが含まれていないことがありますmain_idが、他のテーブルを結合して、見つからない値を null で埋めたいと思います。
その場合、結果を次のようにしたいと思います
main_id x y z extra_id foo bar a b c null null。たとえば。

ID を使用して複数の SQL テーブルを結合するにはどうすればよいですか? テンプレートとしてですが、完全には取得できませんでした。

これは私がこれまでに試したことです:

SELECT
  m.*,
  a.*,
  b.*,
  c.*,
FROM
  MainTable m,
  SubTableA a,
  SubTableB b,
  SubTableC c,
WHERE
  m.main_id = a.main_id(+)
  AND a.main_id=b.main_id(+)
  AND a.extra_id=b.extra_id(+)
  AND a.main_id = c.main_id(+)
  AND a.extra_id = c.extra_id(+);

編集:
メインテーブルのすべての行が必要です。それらが main_id のサブテーブルと一致する場合、extra_id ごとにそれらを結合します (各 main_id に対して複数の可能性があります)。また、main_id と extra_id の組み合わせが複数のサブテーブルに存在する場合は、それらを結合したいと考えています。再びラップトップの前にいるときのより詳細な例を示します。

SQLフィドル

ありがとう、
クリスチャン

4

2 に答える 2

1

結合を見てみましょう。Main を A に結合したいのですが、A に存在するが main_id を持たないすべての行を保持しますよね? したがって、結合の右側からすべてが必要です。

MainTable M RIGHT JOIN SubTableA A ON M.main_id = A.main_id

そして、これをすべてのテーブルで実行したいと考えています。

SELECT
    A.*
    , B.*
    , C.*
FROM
    MainTable M
     RIGHT JOIN SubTableA A ON M.main_id = A.main_id
     RIGHT JOIN SubTableB B ON M.main_id = B.main_id
     RIGHT JOIN SubTableC C ON M.main_id = C.main_id

WHERE
[some stuff]

注: RIGHT OUTER JOIN を試すこともできます。注 2: 説明に戸惑いました。行がメインに存在するがサブテーブルには存在しない場合は、結合の反対側に存在するかどうかに関係なく、メインのすべての行が必要です。行がサブテーブルに存在するがメインではない場合は、RIGHT OUTER が必要です。

PSこれがオラクル用だとは知らなかったので、あまり変わらないことを願っています。

于 2013-10-02T15:39:51.967 に答える
1

この回答は、右結合ではなく結合が必要であることを前提としています。つまり、MainTable関連する行がなくても常にからの行を表示し、他の行を表示SubTableAします。monoこれは、およびの null 値を含むサンプル出力によって暗示されますstereo

新しい結合構文に移行します。列を含める場合は、に依存するのではなく名前を付ける必要がありますSELECT *SELECT *迅速なアドホック クエリには問題ありませんが、それ以上の場合は列に名前を付ける必要があります。

また、タイピングを減らすためにエイリアシングをお勧めします。あなたの例では and を考えるSCAD、あなたはそれをしていたようです。

SELECT
  m.main_id,
  m.x,
  m.y,
  m.z,
  a.extra_id,
  a.foo,
  a.bar,
  b.a,
  b.b,
  b.c,
  c.mono,
  c.stereo
FROM MainTable m
LEFT JOIN SubTableA a
  ON m.main_id = a.main_id
LEFT JOIN SubTableB b
  ON a.main_id = b.main_id AND a.extra_id = b.extra_id
LEFT JOIN SubTableC c
  ON a.main_id = b.main_id AND a.extra_id = c.extra_id
于 2013-10-02T15:46:08.753 に答える