Использование избыточной таблицы в запросе ANSI JOIN в Oracle 12 - PullRequest
1 голос
/ 08 мая 2020

Сегодня я столкнулся с проблемой с набором результатов SELECT, потому что - по ошибке - я дважды поместил одну и ту же таблицу в оператор, использующий ANSI JOIN. И ORACLE не закончил с ошибкой (что я ожидал), но, похоже, использует "внутренние разные" имена для таблицы.

Возможно, кто-то знает, является ли это описанным / ожидаемым поведением ORACLE обработка ANSI JOIN. Итак, здесь мы go с моим коротким примером (это не тот SELECT, с которым я столкнулся с проблемой. Этот был намного сложнее;))

create table a (a_id number(10),
                a_name varchar2(64 char)
               );
create table b (b_id number(10),
                a_id number(10),
                b_name varchar2(64 char)
               );

insert into a values (1,'name1');
insert into a values (2,'name2');
insert into a values (3,'name3');
insert into a values (4,'name4');

insert into b values (1,1,'something1.1');
insert into b values (2,1,'something2.1');
insert into b values (3,1,'something3.1');
insert into b values (4,2,'something4.2');
insert into b values (5,3,'something5.3');
insert into b values (6,3,'something6.3');
insert into b values (7,4,'something7.4');

select * from a
inner join b on b.a_id = a.a_id
inner join b on b.a_id = a.a_id
where b.b_name = 'something5.3';

Результат будет следующим:

A_ID    A_NAME    B_ID    A_ID_1    B_NAME         B_ID_1   A_ID_2    B_NAME_1
3       name3     5       3         something5.3   5        3         something5.3
3       name3     5       3         something5.3   6        3         something6.3

Очевидно, что ORACLE использует первое вхождение «b» для условия WHERE. Это кажется логичным.

Но я ожидал сообщения об ошибке вместо обработки этого запроса. Итак, мой вопрос к вам: это функция, а не ошибка?

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Это известно как «самосоединение» - вы присоединяете таблицу к самой себе. Это должно быть разрешено в любой реляционной базе данных. При нормальном использовании я ожидаю, что каждому использованию таблицы будет назначен уникальный псевдоним, чтобы можно было различить значения, извлеченные из каждого соединения.

1 голос
/ 08 мая 2020

Думаю, ни то, ни другое; если вы не вызываете self join a feature .

Если вы хотите, чтобы он работал по-другому, используйте разные псевдонимы таблиц и используйте их по мере необходимости.

...