Oracle (Old?) Joins – Uno strumento / script per la conversione?

Ho effettuato il porting di oracle select e ho eseguito molte query in questo modo:

SELECT e.last_name, d.department_name FROM employees e, departments d WHERE e.department_id(+) = d.department_id; 

…e:

 SELECT last_name, d.department_id FROM employees e, departments d WHERE e.department_id = d.department_id(+); 

Esistono guide / esercitazioni per convertire tutte le varianti della syntax (+)? Qual è la syntax chiamata anche (così posso setacciare google)?

Ancora meglio .. C’è uno strumento / script che farà questa conversione per me (Preferred Free)? Un ottimizzatore di qualche tipo? Ho circa 500 di queste query per port ..

Quando è stato eliminato questo standard? Qualsiasi informazione è apprezzata.

La (+) è syntax OUTER JOIN pre-ANSI-92 specifica di Oracle, poiché la syntax ANSI-89 non fornisce la syntax per il supporto OUTER JOIN .

Sia che sia RIGHT o LEFT è determinato da quale tabella e colonna di riferimento è associata la notazione. Se viene specificato accanto a una colonna associata alla prima tabella nella clausola FROM , è un join di RIGHT . Altrimenti, è un join LEFT . Questo è un buon riferimento per chiunque abbia bisogno di conoscere la differenza tra JOINs .

Prima query riscritta usando la syntax ANSI-92:

  SELECT e.lastname, d.department_name FROM EMPLOYEES e RIGHT JOIN DEPARTMENTS d ON d.departmentid = e.departmentid 

Seconda query riscritta usando la syntax ANSI-92:

  SELECT e.lastname, d.department_name FROM EMPLOYEES e LEFT JOIN DEPARTMENTS d ON d.departmentid = e.departmentid 

Google “Oracle join syntax”. il (+) è usato per diversi sapori di join esterni. Penso che il primo che hai mostrato sia un Left Outer Join, e il secondo è un Right Outer Join. Non ho visto questa notazione per un po ‘di tempo, quindi potrei essere un po’ fuori, ma spero che questo ti dia abbastanza informazioni per colpire Google e ottenere la risposta giusta.

AGGIORNARE:

Quindi vuoi uno strumento per farlo per te? Ho sentito che SwisSQL può fare qualcosa del genere, ma se la maggior parte delle query è abbastanza semplice puoi probabilmente scrivere un piccolo script che lo fa per te. La risposta di OMG Pony mostra bene il pattern per la conversione dalla syntax vecchia alla nuova.

Questo può diventare piuttosto complicato come la clausola WHERE anche in situazioni semplici come

 WHERE e.id = d.manager_id(+) OR e.id = d.contact_id(+) 

tradurrà in UNION o sottoselezionerà query.

Se ti piace Python potresti dare un’occhiata a sqlparse , sembra promettente e potresti farlo fare ciò che ti serve più una riformattazione del codice SQL. Funzionerebbe facilmente direttamente sulla fonte. Dovrai dirgli cosa fare ma ti solleverà dallo scrivere la noiosa parte del parsing.

Per Oracle 10g

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/queries006.htm#i2054012

Puoi trovare le altre versioni dei manuali di Oracle in linea se la tua versione è diversa, sebbene la syntax di join non sia probabilmente diversa.

Mi sembra di ricordare questa syntax che si sta allontanando nella transizione da Oracle 8i a 9i – Penso che abbiamo avuto un plug-in di rospo che ha finito per convertire tutto per noi solo così non abbiamo dovuto perdere tempo a passare attraverso ogni query

Non conosco uno strumento per effettuare la conversione automaticamente, ma anche se ci fosse, dovresti comunque rivedere le sue modifiche caso per caso. Pertanto, non penso che uno strumento ti possa risparmiare molto tempo.

http://www.dba-oracle.com/oracle_news/2004_2_19_rittman.htm dice:

Non vi è alcun vantaggio in termini di prestazioni o viene colpito utilizzando join ANSI anziché join tradizionali, ma utilizzando i join ANSI, le query sono più portabili tra le piattaforms DBMS e sono leggermente più facili da leggere. Alla fine, però, dipende dalle preferenze personali e, sebbene ci siano dei vantaggi rispetto allo standard ANSI, non è necessario cambiare se non si desidera.

Inoltre non devi usare uno stile o l’altro ovunque. Puoi convertire il codice una query alla volta, con la certezza che continueranno a funzionare. Vorrei lasciare le query così come sono e risolvere l’uso della syntax ANSI SQL-92 nel nuovo codice.