2009-10-23 2 views
1

Почему это не работает в Oracle?Есть ли способ сделать несколько левых внешних соединений в оракуле?

Есть ли способ сделать эту работу?

FROM table1 a, 
    table2 b, 
    table3 c 
WHERE a.some_id = '10' 
AND a.other_id (+)= b.other_id 
AND a.other_id (+)= c.other_id 

Я хочу table1, чтобы оставить внешним сдвинуты по нескольким таблицам ...

Если я пытаюсь изменить его использовать ANSI присоединиться, я получаю ошибку компиляции. Я сделал следующее:

FROM table2 b, table3 c 
LEFT JOIN table1 a ON a.other_id = b.other_id and a.other_id = c.other_id 

ответ

7

ОК, глядя на examples из документов Oracle, мое воспоминание о синтаксисе было верным, поэтому я перехожу к моему комментарию в ответ. Предполагая, что ваша цель - это левое внешнее соединение, где A - базовая таблица, и вы присоединяете соответствующие строки из B и C, перепишите свой запрос следующим образом (обратите внимание, что я просто изменяю префиксы, мне нравится иметь исходный набор строк право).

FROM table1 a, 
    table2 b, 
    table3 c 
WHERE a.some_id = '10' 
AND b.other_id (+)= a.other_id 
AND c.other_id (+)= a.other_id 

Если это не то, что вы пытаетесь сделать, то этот запрос BORKED: вы делаете декартовой присоединиться к В и С, а затем пытается внешнее соединение с этого частичного результата к А, с дополнительный предикат на А. Это не имеет большого смысла.

+0

Я хочу уточнить.У меня создалось впечатление, что если (+) находится справа от какого-то столбца, тогда LEFT JOIN находится на этой таблице ... я ошибаюсь? Да, я хочу, чтобы table1 a был базовым столом – Omnipresent

+0

Вы ошибаетесь - посмотрите ссылку на примеры, которую я предоставил – kdgregory

+0

, поэтому в этом. левое соединение выполняется на что мы получим все строки – Omnipresent

5

использование ansi соединения. Они являются более понятными ИМО. BUt по какой-то причине они не работают с материализованными представлениями ...

+0

+1 - это намного яснее, но Oracle не поддерживал его до тех пор, пока (я считаю) 10g, поэтому есть старый код устаревшего кода со старым синтаксисом. И, вероятно, лучше использовать последовательный синтаксис. – kdgregory

+0

@kdgregory: Нет, я использовал ANSI JOINs в 9i просто отлично. –

0

В oracle вы не можете подключиться к одной таблице к нескольким другим таблицам. Вы можете создавать представления, в которых есть объединения, а затем присоединиться к этому представлению. В качестве побочного примечания вы также не можете использовать внешнее соединение для выбора sub, так что это тоже не вариант.

2

Вы можете сделать что-то вроде этого.

FROM table1 a,  table2 b,  table3 c 
WHERE a.some_id = '10' 
AND a.other_id = b.other_id(+) 
AND a.other_id = c.other_id(+) 
+0

снова, я думаю, что положить (+) справа сделает таблицы2 и table3 базовыми таблицами. где, как я хочу, таблица1 a будет базой – Omnipresent

+0

no. таблица1 является базой в вышеприведенном запросе. –

+0

Согласовано. Поскольку исходный запрос имеет условие равенства для some_id в таблице1, он не имеет никакого смысла для внешней таблицы join1 для других таблиц, что и выполнял первоначальный запрос. Предположительно, вы хотите, чтобы внешнее объединение двух других таблиц в таблицу1, что и делает запрос Генри. –

2

Я хотел обратиться отдельно эту часть вашего вопроса:

If I try to change it to ANSI join I get compilation errors. I did the following: 

FROM table2 b, table3 c 
LEFT JOIN table1 a ON a.other_id = b.other_id and a.other_id = c.other_id 

В ANSI присоединиться, по крайней мере, в Oracle, вы работаете на ровно два источника строк. Оператор LEFT JOIN в вашем примере имеет table3 и table1 в качестве своих операндов; поэтому вы не можете ссылаться на «b.otherid» в предложении ON. Для каждой дополнительной таблицы нужен новый оператор соединения.

Я считаю, что вы пытаетесь сделать, это внешнее соединение таблицы 2 и таблицы 3 к таблице 1. Так что вы должны делать это:

FROM table1 a LEFT JOIN table2 b ON b.other_id = a.other_id 
       LEFT JOIN table3 c ON c.other_id = a.other_id 

или запрос Генри Гао, если вы хотите использовать Oracle -специфический синтаксис.

0

Вы могли бы с курса попробовать следующее (таблица Б и являющийся BASE) FROM (SELECT other_id FROM table2 UNION ВЫБРАТЬ other_id ОТ Table3) б LEFT JOIN TABLE1 b.other_id = a.other_id

Но опять же я Oracle Nono

Смежные вопросы