Как сделать внешнее соединение на > 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 ответа:
Итак, я визуализирую вашу схему следующим образом:
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, но внутренний присоединяется отфильтровал некоторые результаты.