Как сделать внешнее соединение на > 2 таблицах (Oracle)


Я не знаю, как описать структуру моей таблицы, поэтому надеюсь, что это имеет смысл...

У меня есть 3 таблицы в иерархическом отношении, такие что A имеет отношение один ко многим к B, которое, в свою очередь, имеет отношение один ко многим с C. трюк заключается в том, что внешний ключ в B и C разрешается быть нулевым (т. е. не определен родитель). У меня также есть D и E, не имеющие никакого отношения к A, B или C (непосредственно).

Наконец, у меня есть F, которая является таблицей соединений со многими отношениями к одному с C, D и E. ни одно из его полей (FKs к другим таблицам) не может быть обнулено.

Я хотел бы написать инструкцию SQL, которая объединяет все таблицы в один результирующий набор. Я знаю, что должен использовать внешние соединения, потому что я хочу, чтобы все A возвращались независимо от того, есть ли у него потомки В B и аналогичные с B и C.

Вопрос первый: я изучал синтаксис ANSI outer join (раньше я использовал только Oracle " ( + )") и не могу найти пример, в котором внешние соединения объединяют более 2 таблиц. Мочь кто-то приводит/указывает на пример?

Вопрос второй: можно ли включить записи из таблиц D и E на основе таблицы объединения F? Если да, то делается ли это с помощью внешних соединений?

Спасибо!

EDIT

Конечно, сразу после того, как я опубликовал это, я нашел пример, который отвечает на вопрос 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 5

4 ответа:

Итак, я визуализирую вашу схему следующим образом:

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

Эти скобки являютсяне подзапросами, они просто группируют операции соединения.

 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

Для уточнения прописные буквы относятся к таблицам, а строчные-к столбцам первичного / внешнего ключа. Я, вероятно, должен был написать его похожим на 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

Я попытался настроить свой SQL, как у Билла, но с использованием полных соединений вместо левых, но он не вернул те же результаты, что и мой. Я не могу сказать, что полностью понимаю его SQL, но внутренний присоединяется отфильтровал некоторые результаты.