2010-09-15 1 views
5

Я не знаю, как описать мою структуру таблицы, так что надеюсь, что это имеет смысл ...Как сделать внешнее соединение на> 2 таблицы (Oracle)

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

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

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

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

Вопрос: Можно ли включать записи из таблиц 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 
+0

Возможно, вы не хотите ПОЛНОГО ВНЕШНЕГО СОЕДИНИТЕЛЯ; он существует, но он очень редко используется (или полезен). –

+0

Вы не указали, какие столбцы в F соединяются с каждой из других таблиц, что означает, что никто не может дать окончательный ответ. –

+0

Не могли бы вы разместить некоторые образцы данных и набор записей, которые вы хотели бы получить? A, B - это не очень информативные имена. – Quassnoi

ответ

0

Для пояснения заглавные буквы относятся к таблицам и строчным буквам к столбцам первичного/внешнего ключа. Вероятно, я должен был написать его так же, как Quassnoi, но буду продолжать это, потому что так оно и началось.

Этот SQL возвращает результаты я loooking для:

  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, но INNER присоединяется к фильтрам некоторых результатов.

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 
+0

Спасибо! Мы должны были отправлять сообщения одновременно. – sdoca

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 
9

Я визуализировать вашу схему, как это:

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 

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

+2

Это отличный способ «рисовать» мою схему. Благодаря! Мне нужно потратить некоторое время на выяснение, делает ли ваш оператор выбора то, что я надеюсь, но я думаю, что мне нужно использовать FULL-соединения в соответствии с моим комментарием выше для Джонатана. – sdoca