Я портировал оракула, выбирает, и я натыкался на большое количество запросов как так:
SELECT e.last_name,
d.department_name
FROM employees e,
departments d
WHERE e.department_id(+) = d.department_id;
... и:
SELECT last_name,
d.department_id
FROM employees e,
departments d
WHERE e.department_id = d.department_id(+);
Есть ли какие-либо руководства/учебные руководства для преобразования всех вариантов (+) синтаксис? Чем тот синтаксис даже называют (таким образом, я могу обыскивать Google)?
Еще лучше.. Существует ли инструмент/сценарий, который сделает это преобразование для меня (Предпочтительный Свободный)? Какой-то оптимизатор? У меня есть приблизительно 500 из этих запросов к порту..
Когда это было стандартно постепенно сокращенный? Любая информация ценится.
(+)
- это специфичный для Oracle синтаксис ВНЕШНЕГО СОЕДИНЕНИЯ до ANSI-92, поскольку синтаксис ANSI-89 не поддерживает синтаксис для поддержки OUTER JOIN
.
Будет ли это ВПРАВО
или ВЛЕВО
, определяется ссылкой на таблицу и столбец, к которым прикреплена нотация. Если он указан рядом со столбцом, связанным с первой таблицей, в предложении FROM
- это соединение RIGHT
. В противном случае это соединение LEFT
. Это хороший справочник для всех, кому нужно знать разницу между JOIN .
Первый запрос переписан с использованием синтаксиса ANSI-92:
SELECT e.lastname,
d.department_name
FROM EMPLOYEES e
RIGHT JOIN DEPARTMENTS d ON d.departmentid = e.departmentid
Второй запрос переписан с использованием синтаксиса ANSI-92:
SELECT e.lastname,
d.department_name
FROM EMPLOYEES e
LEFT JOIN DEPARTMENTS d ON d.departmentid = e.departmentid
Google "Синтаксис соединения Oracle". (+)
используется для различных вкусов внешних соединений. Я думаю, что первое, что вы показали, - это левое внешнее соединение, а второе - правое внешнее соединение. Я давно не видел эту нотацию, так что могу немного ошибиться, но, надеюсь, это дает вам достаточно информации, чтобы попасть в Google и получить правильный ответ.
ОБНОВЛЕНИЕ:
Итак, вам нужен инструмент, который сделает это за вас? Я слышал, что SwisSQL может делать что-то подобное, но если большинство запросов достаточно просты, вы, вероятно, можете написать небольшой скрипт, который сделает это за вас. Ответ OMG Ponies прекрасно показывает шаблон для преобразования старого синтаксиса в новый.
Для Oracle 10g
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/queries006.htm#i2054012
Вы можете найти другие версии руководств по Oracle в Интернете, если ваша версия отличается, хотя синтаксис соединения, вероятно, не отличается.
Кажется, я помню, как этот синтаксис исчез при переходе с Oracle 8i на 9i - я думаю, у нас был плагин для жаб, который в конечном итоге преобразовал все за нас просто чтобы нам не приходилось тратить время на просмотр каждого запроса
Это может стать довольно сложным, поскольку предложение WHERE даже в таких простых ситуациях, как
WHERE e.id = d.manager_id(+) OR e.id = d.contact_id(+)
будет переведено в UNION или subselect запрос.
Если вам нравится python, вы можете взглянуть на sqlparse, он выглядит многообещающим, и вы можете заставить его делать то, что вам нужно, плюс немного переформатировать код SQL. Она будет легко работать непосредственно с исходным кодом. Вам придется указывать ему, что делать, но это избавит вас от написания скучной части синтаксического анализа.
Я не знаю инструмента для автоматического преобразования, но даже если бы он был, вы бы все равно захотели просмотреть его изменения в каждом конкретном случае. Поэтому я не думаю, что такой инструмент сэкономит вам много времени.
http://www.dba-oracle.com/oracle_news/2004_2_19_rittman.htm говорит:
Использование ANSI-соединений вместо традиционных не дает преимущества в производительности, но при использовании ANSI-соединений ваши запросы лучше переносятся между платформами СУБД, и их немного легче читать. В конце концов, все зависит от личных предпочтений, и хотя у стандарта ANSI есть свои преимущества, нет необходимости переходить на него, если вы этого не хотите.
Также вам не обязательно везде использовать тот или иной стиль. Вы можете преобразовывать свой код по одному запросу за раз, с некоторой гарантией того, что все они будут продолжать работать. Я бы оставил запросы как есть, а в новом коде решил бы использовать синтаксис ANSI SQL-92.