Oracle (Old?) Joins - инструмент / скрипт для конвертации? - PullRequest
7 голосов
/ 11 марта 2010

Я портировал выбор оракула, и у меня было много запросов вроде:

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)?

Еще лучше .. Есть ли инструмент / скрипт, который сделает это преобразование для меня (Preferred Free)? Какой-то оптимизатор? У меня есть около 500 таких запросов к порту ..

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

Ответы [ 6 ]

22 голосов
/ 11 марта 2010

(+) - это специфичный для Oracle синтаксис pre-ANSI-92 OUTER JOIN, поскольку синтаксис ANSI-89 не обеспечивает синтаксиса для поддержки OUTER JOIN.

Будь то RIGHT или LEFT, определяется ссылкой на таблицу и столбец, к которой прикреплена запись. Если он указан рядом со столбцом, связанным с первой таблицей в предложении FROM - это объединение RIGHT. В противном случае это LEFT соединение. Это хороший справочник для тех, кому нужно знать разницу между СОЕДИНЕНИЯМИ .

Первый запрос переписан с использованием синтаксиса 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
3 голосов
/ 11 марта 2010

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

UPDATE:

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

2 голосов
/ 19 марта 2010

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

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

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

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

1 голос
/ 20 марта 2010

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

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

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

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

1 голос
/ 12 марта 2010

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

1 голос
/ 11 марта 2010

для Oracle 10g

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

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

...