Oracle (Старый?) Соединения - инструмент/сценарий для преобразования?

Я портировал оракула, выбирает, и я натыкался на большое количество запросов как так:

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 из этих запросов к порту..

Когда это было стандартно постепенно сокращенный? Любая информация ценится.

7
задан OMG Ponies 20 March 2010 в 19:30
поделиться

6 ответов

(+) - это специфичный для 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
22
ответ дан 6 December 2019 в 06:03
поделиться

Google "Синтаксис соединения Oracle". (+) используется для различных вкусов внешних соединений. Я думаю, что первое, что вы показали, - это левое внешнее соединение, а второе - правое внешнее соединение. Я давно не видел эту нотацию, так что могу немного ошибиться, но, надеюсь, это дает вам достаточно информации, чтобы попасть в Google и получить правильный ответ.

ОБНОВЛЕНИЕ:

Итак, вам нужен инструмент, который сделает это за вас? Я слышал, что SwisSQL может делать что-то подобное, но если большинство запросов достаточно просты, вы, вероятно, можете написать небольшой скрипт, который сделает это за вас. Ответ OMG Ponies прекрасно показывает шаблон для преобразования старого синтаксиса в новый.

3
ответ дан 6 December 2019 в 06:03
поделиться

Для Oracle 10g

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

Вы можете найти другие версии руководств по Oracle в Интернете, если ваша версия отличается, хотя синтаксис соединения, вероятно, не отличается.

1
ответ дан 6 December 2019 в 06:03
поделиться

Кажется, я помню, как этот синтаксис исчез при переходе с Oracle 8i на 9i - я думаю, у нас был плагин для жаб, который в конечном итоге преобразовал все за нас просто чтобы нам не приходилось тратить время на просмотр каждого запроса

1
ответ дан 6 December 2019 в 06:03
поделиться

Это может стать довольно сложным, поскольку предложение WHERE даже в таких простых ситуациях, как

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

будет переведено в UNION или subselect запрос.

Если вам нравится python, вы можете взглянуть на sqlparse, он выглядит многообещающим, и вы можете заставить его делать то, что вам нужно, плюс немного переформатировать код SQL. Она будет легко работать непосредственно с исходным кодом. Вам придется указывать ему, что делать, но это избавит вас от написания скучной части синтаксического анализа.

2
ответ дан 6 December 2019 в 06:03
поделиться

Я не знаю инструмента для автоматического преобразования, но даже если бы он был, вы бы все равно захотели просмотреть его изменения в каждом конкретном случае. Поэтому я не думаю, что такой инструмент сэкономит вам много времени.

http://www.dba-oracle.com/oracle_news/2004_2_19_rittman.htm говорит:

Использование ANSI-соединений вместо традиционных не дает преимущества в производительности, но при использовании ANSI-соединений ваши запросы лучше переносятся между платформами СУБД, и их немного легче читать. В конце концов, все зависит от личных предпочтений, и хотя у стандарта ANSI есть свои преимущества, нет необходимости переходить на него, если вы этого не хотите.

Также вам не обязательно везде использовать тот или иной стиль. Вы можете преобразовывать свой код по одному запросу за раз, с некоторой гарантией того, что все они будут продолжать работать. Я бы оставил запросы как есть, а в новом коде решил бы использовать синтаксис ANSI SQL-92.

1
ответ дан 6 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: