2014-01-29 1 views
3

У меня возникла проблема с преобразованием стандартного SQL-соединения в старый синтаксис соединения Oracle (пожалуйста, не спрашивайте меня, зачем мне это нужно). Я хотел бы ожидать того же результата, во всяком случае, это не так:Преобразование из стандартного SQL в Oracle Синтаксис

Образец данных:

create table testing (
aid number(8), 
bid number(8), 
btext varchar(80)); 

insert into testing values (100,1,'text1a'); 
insert into testing values (100,2,'text1b'); 
insert into testing values (100,3,'text1c'); 
insert into testing values (200,19,'text2b'); 
insert into testing values (200,18,'text2a'); 
insert into testing values (300,4324,'text3a'); 
insert into testing values (500,80,'text4a'); 
insert into testing values (50,2000,'text5a'); 
commit; 

Стандарт SQL:

select a.*,b.* from testing a 
left outer join testing b 
on (a.aid = b.aid and a.bid < b.bid) 
order by a.aid, b.bid; 

AID BID BTEXT AID_1 BID_1 BTEXT_1 
50 200 text5a NULL NULL NULL 
100 1 text1a 100  2  text1b 
100 2 text1b 100  3  text1c 
100 1 text1a 100  3  text1c 
100 3 text1c NULL NULL NULL 
200 18 text2a 200  19  text2b 
200 19 text2b NULL NULL NULL 
300 432 text3a NULL NULL NULL 
500 80 text4a NULL NULL NULL 

Oracle SQL:

select a.*,b.* from testing a, testing b 
where a.aid = b.aid(+) 
and a.bid < b.bid 
order by a.aid, b.bid; 

AID BID BTEXT AID_1 BID_1 BTEXT_1 
100 1 text1a 100  2  text1b 
100 2 text1b 100  3  text1c 
100 1 text1a 100  3  text1c 
200 18 text2a 200  19  text2b 

Как получить тот же результат стандартного SQL с использованием устаревшего синтаксиса Oracle?

+1

Почему вы хотите использовать устаревший синтаксис? Я знаю, что вы писали, не спрашивайте, но ... Используйте стандарт ANSI, и вам не нужно ничего конвертировать. – Ben

+0

Существуют компании (даже крупные), которые «по историческим причинам» вынуждают использовать старый синтаксис даже при использовании Oracle 12c. Мне тоже это не нравится ... – royskatt

+0

Если вам нравится создавать 'MATERIALIZED VIEW' с' FAST REFRESH', вам нужно использовать старый синтаксис Oracle, ANSI не работает. Даже в версии 12c Oracle не считает это ошибкой, это просто «недостаток документации» !!! –

ответ

3

Ваш оператор стиля Oracle нуждается в операторе (+) также в состоянии, отличном от этого, поскольку это также является частью ваших критериев соединения в стандартной версии SQL.

select a.*,b.* from testing a, testing b 
where a.aid = b.aid(+) 
and a.bid < b.bid(+) 
order by a.aid, b.bid; 

See sqlfiddle here.

+0

Большое спасибо, также за ссылку! – royskatt