Есть ли официальная рекомендация Oracle по использованию явных ANSI JOINs против неявных объединений?

Примечание. Я не прошу вас сказать мне "использовать явные соединения", но ищет официальную позицию Oracle, если таковая имеется в этом вопросе.

Из документации базы данных Oracle (также появляется в документах 9i и 11g):

Oracle рекомендует использовать синтаксис FROM OUTER JOINа не оператор объединения Oracle. Запросы внешнего соединения, которые используют Оператор объединения Oracle (+) подчиняется следующим правилам и ограничения [...]

Другими словами, Oracle советует предпочесть первую из этих двух форм:

FROM a LEFT JOIN b ON b.x = a.x
vs
FROM a, b WHERE b.x(+) = a.x

Тем не менее, я никогда не обнаружил в какой-либо документации Oracle единственную рекомендацию использовать предпочтительно одну из этих двух форм:

FROM a INNER JOIN b ON b.x = a.x
vs
FROM a, b WHERE b.x = a.x

Есть ли пропущенный абзац?

Ответы

Ответ 1

Я не видел его, если он есть. Причина предпочтительности синтаксиса ANSI для внешних соединений в частности (помимо нестандартного символа (+) для Oracle) заключается в том, что более внешние соединения выражаются с использованием синтаксиса ANSI. Ограничение "ORA-01417: таблица может быть внешней, соединенной не более чем с одной другой таблицей" относится к внешним соединениям (+), но не к внешним соединениям ANSI. Другие ограничения на (+), которые не применяются к внешним объединениям ANSI, описаны здесь.

Один уважаемый эксперт Oracle фактически рекомендует придерживаться старого синтаксиса для внутренних объединений - см. блог Джонатана Льюиса. Он говорит, что присоединение ANSI в любом случае трансформируется в традиционное объединение Oracle под обложками. Я не согласен с ним на 100% (я предпочитаю, чтобы ANSI присоединился к себе в целом), но не претендует на то, чтобы иметь часть своих знаний по этой теме.

В двух словах внешние соединения ANSI технически превосходят старые соединения (+), тогда как с внутренними соединениями это скорее всего вопрос стиля.

Ответ 2

На сайте поддержки Oracle есть ряд заметок по проблемам с синтаксисом объединения ANSI с обходными решениями, рекомендующими использовать синтаксис oracle.

Ошибка 5188321 неправильных результатов (без строк) ИЛИ ORA-1445 из внешнего соединения ANSI

Versions affected: Versions >= 9.2.0.1 but < 11 

Description
Wrong results or an ORA-1445 can be returned with a query involving a 
 very large select list count when ANSI OUTER JOIN syntax is used.


Workaround
  Use native oracle outer join syntax 
 or 
  reduce the select list count.

Ошибка 5368296 ANSI join SQL не может сообщать ORA-918 для неоднозначного столбца

Versions affected: Versions < 11

Description

****
Note: This fix introduces the problem described in bug 7318276
      One off fixes for that bug address the issue here also.
****      

ORA-918 is not reported for an ambiguous column in a query 
involving an ANSI join of more than 2 tables/objects. 

eg:
 -- 2 table join, returns ORA-918
 SELECT  empno 
 FROM emp a JOIN emp b  on a.empno = b.empno; 

 -- 3 table join does not report ORA-918 when it should ...
 SELECT  empno
 FROM emp a JOIN emp b on a.empno = b.empno
            JOIN emp c on a.empno = c.empno;

Ошибка 7670135 Длительное время синтаксического разбора ANSI join

 Versions affected: Versions BELOW 11.2 

Description

A query having ANSI join(s) may take noticeable time during query compilation,
especially if the query includes an NVL() function.

Workaround:
 Use ORACLE join instead of ANSI join

Из Oracle Press - Oracle OCP 11g все в одном руководстве по экзамену

enter image description here

И от asktom (кто не коммандит)

 Historically there have been bugs related to ANSI syntax, in fact even the 
 10.2.0.4 projected issues list includes 10 bugs/issues related to ANSI syntax.

 In the past I've encountered some of these bugs myself, and have continued to use 
 and advocate the "traditional" Oracle style.

 I'd like to know if you feel that the implementation of ANSI syntax is now equally    
 robust compared  to the traditional syntax.

 Followup   February 19, 2008 - 5pm Central time zone:
 unfortunately, there are bugs in non-ansi joins too, probably more than 10 in fact.

 I personally do not use the new syntax (except in the rare case of a full outer join, 
 a truly rare beast to encounter). I have no comment on it really. 

См. также более ранний вопрос по той же теме Разница между нотами Oracle плюс (+) и ansi JOIN нотация?

Я также нашел это выражение в документе, но не указал, где он пришел из

"Начиная с Oracle 9i, Oracle рекомендует разработчикам SQL использовать синтаксис объединения ANSI вместо синтаксиса Oracle (+). Для этой рекомендации есть несколько причин, в том числе:

• Легче отделять и читать (не смешивая код соединения и ограничения) • Легче построить код соединения правильно (особенно в случае "внешних" объединений) • Портативный синтаксис будет работать на всех других ANSI-совместимых базах данных, таких как MS SQL Server, DB2, MySQL, PostgreSQL и др. • Поскольку он является общепринятым стандартом, его общая цель для всех будущих инструментов базы данных и сторонних поставщиков • Собственный синтаксис внешнего внешнего соединения Oracle (+) может использоваться только в одном направлении за раз, он не может выполнять полное внешнее соединение • Плюс эти дополнительные ограничения из документации Oracle: o Оператор (+) может применяться только к столбцу, а не к произвольному выражению. Однако произвольное выражение может содержать один или несколько столбцов, помеченных оператором (+). o Условие, содержащее оператор (+), нельзя комбинировать с другим условием, используя логический оператор OR. o Условие не может использовать условие сравнения IN для сравнения столбца, помеченного оператором (+), с выражением. o Условие не может сравнивать любой столбец, помеченный оператором (+) с подзапросом. "

Таким образом, его время, чтобы охватить синтаксис объединения ANSI и перейти в 21-й век