Отправляет email-рассылки с помощью сервиса Sendsay

Открыто о СУБД Oracle на русском

  Все выпуски  

Открыто о СУБД Oracle на русском - немного про соединения


Информационный Канал Subscribe.Ru


Выпуск 2

Немного про соединения

Уважаемые подписчики! Это очередной выпуск, посвященный одному из вопросов, на которые ответил вчера, 10 июня 2002 года, знаменитый дядя Том (Том Кайт) на сайте asktom.oracle.com. Мне показалось, что тема внешних соединений стоит отдельного рассмотрения.


Дядю Тома спросили про внешние соединения в PL/SQL:

При организации цикла по курсору вида:

for x in (Select * from table1, table2, table 3 where               
table1.a=table2.a(+) and table1.a=table3.a(+))
LOOP
 ...
END LOOP

можно ли использовать любой оператор select, например, соединяющий 6 таблиц с разнообразными фильтрами и связываемыми переменными.

и он ответил

да.

Обсуждение

Комментарий Суреша (Suresh) из Нью-Йорка, 8 июня 2002 года

Том,
возвращаясь к исходному вопросу, не мог бы ты сказать, сколько таблиц можно соединять внешним соединением в одном SQL-операторе? Спасибо.

Ответ дяди Тома

Я не знаю никаких ограничений.

Вот "весьма большое" соединение

  1  declare
  2     l_query long;
  3     l_cnt   number;
  4  begin
  5     l_query := 'select count(*) from dual d1';
  6     for i in 2 .. 255
  7     loop
  8             l_query := l_query || ', dual d'||i;
  9     end loop;
 10     l_query := l_query || ' where 1=1 ';
 11     for i in 2 .. 255
 12     loop
 13             l_query := l_query  || ' and d1.dummy = d' || i || '.dummy(+) ';
 14     end loop;
 15     execute immediate l_query into l_cnt;
 16     dbms_output.put_line( 'and the answer is ' || l_cnt );
 17* end;
 18  /
and the answer is 1


PL/SQL procedure successfully completed.

Комментарий Суреша, 9 июня 2002 года

Том,
Спасибо за ответ о максимальном количестве таблиц, которые можно соединять внешне в одном SQL-операторе. Я спрашивал об этом потому, что некоторое время назад я получил следующее сообщение об ошибке при попытке сделать более одного внешнего соединения в операторе.

ORA-01417: a table may be outer joined to at most one other table 

Итак, из твоего ответа я понял, что соединять внешним соединением в одном SQL-операторе можно сколько угодно таблиц, а приведенное выше сообщение об ошибке ясно говорит, что таблица не может соединяться внешне более чем с одной таблицей в операторе.

Разъясни, пожалуйста, как это согласовать.

Ответ дяди Тома

Сообщение об ошибке говорит, что если не которая таблица T внешне соединяется с другой таблицей, T2, то таблицу T в этом операторе нельзя внешне соединять с таблицей T3. В следующем примере, D1 = T, D2 = T2, D3 = T3:

ops$tkyte@ORA817DEV.US.ORACLE.COM> select * from dual d1, dual d2, dual d3
  2  where d1.dummy (+) = d2.dummy and d1.dummy(+) = d3.dummy;
where d1.dummy (+) = d2.dummy and d1.dummy(+) = d3.dummy
                   *
ERROR at line 2:
ORA-01417: a table may be outer joined to at most one other table

Именно это сообщение об ошибке вы и получаете. Эту проблему можно обойти с помощью неявных представлений (inline views):

  1  select *
  2    from ( select d1.dummy d1_dummy, d2.dummy d2_dummy
  3                from dual d1, dual d2
  4               where d1.dummy(+) = d2.dummy ) d_temp,
  5        dual d3
  6*  where d_temp.d1_dummy(+) = d3.dummy
ops$tkyte@ORA817DEV.US.ORACLE.COM> /

D D D
- - -
X X X

Это приводит к временному созданию "d_temp" и эта "таблица" соединяется внешне с d3. Получаем требуемый результат (без всяких сообщений об ошибках).


Оригинал обсуждения этого вопроса можно найти здесь. Некоторые несущественные детали, вопросы по ходу и восторженные комментарии читателей не переведены. Мои комментарии - в одном из следующих выпусков.


В следующем выпуске

Следующий выпуск будет посвящен обзору новых материалов, опубликованных в мае на сайте Ixora. Следите за новостями на сайте проекта Open Oracle.

С наилучшими пожеланиями,

  В.К.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное