2014-01-29 6 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 

오라클 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과 동일한 결과가 있습니까?

+1

왜 기존 구문을 사용할까요? 당신이 묻지는 않았지만 ANSI 표준을 사용하면 아무것도 변환 할 필요가 없다는 것을 알고 있습니다. – Ben

+0

"역사적인 이유로"Oracle 12c를 사용하는 경우에도 이전 구문을 사용하도록 강요하는 회사 (심지어는 큰 회사)가 있습니다. 나는 그것을 좋아하지 않는다 ... – royskatt

+0

'FAST REFRESH'로'MATERIALIZED VIEW'를 만들고 싶다면 오래된 오라클 문법을 사용해야한다. ANSI는 작동하지 않는다. 버전 12c에서도 오라클은 이것을 버그라고 생각하지 않습니다. 단지 "문서가 부족합니다"!!! –

답변

3

오라클 스타일 명령문은 less-than 조건에도 (+) 연산자가 필요합니다. 이는 표준 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