Rewrite Oracle proprietary joins to ANSI SQL compliant joins
This demo illustrates how to rewrite Oracle proprietary joins to ANSI SQL compliant joins, it’s a very useful tool if you have lots of old Oracle propriety joins that need to be converted to ANSI SQL compliant joins. You can also learn how to rewrite SQL to meet your own requirement from this demo.
Oracle propriety joins
SELECT e.employee_id,
e.last_name,
e.department_id
FROM employees e,
departments d
WHERE e.department_id = d.department_id
Convert to ANSI SQL compliant joins
SELECT e.employee_id,
e.last_name,
e.department_id
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
Download demo with C# source code, Java demo, demo with delphi source code. ANSI C demo
Here are some common mistakes people made when convert Oracle propriety joins to ANSI SQL syntax:
1. condition in where clause was broken after moving some conditions to join clause.
WHERE (pal.application_location_id = pualr.application_location_id
AND pu.jbp_uid = pualr.jbp_uid
AND pu.username = 'USERID')
becomes this:
WHERE (
AND <=== additional keyword not removed
pu.jbp_uid = pualr.jbp_uid
AND pu.username = 'USERID')
2. additional join condition was missing
SELECT m.*,
altname.last_name last_name_student,
altname.first_name first_name_student,
ccu.date_joined,
ccu.last_login,
ccu.photo_id,
ccu.last_updated
FROM summit.mstr m,
summit.alt_name altname,
smmtccon.ccn_user ccu
WHERE m.id =?
AND m.id = altname.id(+)
AND m.id = ccu.id(+)
AND altname.grad_name_ind(+) = '*'
After convert to ANSI SQL syntax:
SELECT m.*,
altname.last_name last_name_student,
altname.first_name first_name_student,
ccu.date_joined,
ccu.last_login,
ccu.photo_id,
ccu.last_updated
FROM summit.mstr m
left outer join summit.alt_name altname
on m.id = altname.id <=== missing condition: altname.grad_name_ind = '*'
left outer join smmtccon.ccn_user ccu on m.id = ccu.id
WHERE m.id =?
3. join table is referenced before it has been joined
select * from ods_trf_pnb_stuf_lijst_adrsrt2 lst , ods_stg_pnb_stuf_pers_adr pas , ods_stg_pnb_stuf_pers_nat nat , ods_stg_pnb_stuf_adr adr , ods_stg_pnb_stuf_np prs where pas.soort_adres = lst.soort_adres and prs.id(+) = nat.prs_id and adr.id = pas.adr_id and prs.id = pas.prs_id and lst.persoonssoort = 'PERSOON' and pas.einddatumrelatie is null
After convert to ANSI SQL syntax:
select *
from ods_trf_pnb_stuf_lijst_adrsrt2 lst
join ods_stg_pnb_stuf_pers_adr pas
on (pas.soort_adres = lst.soort_adres)
right outer join ods_stg_pnb_stuf_pers_nat nat
on (prs.id = nat.prs_id) <===prs.id invalid identifier
join ods_stg_pnb_stuf_adr adr
on (adr.id = pas.adr_id)
join ods_stg_pnb_stuf_np prs <==== prs was joined here
on (prs.id = pas.prs_id)
where lst.persoonssoort = 'PERSOON'
and pas.einddatumrelatie is null
More information about SQL join:

