WedX - журнал о программировании и компьютерных науках

В чем разница между предложением join в предложении FROM и предложением WHERE?

У нас есть Oracle 10g, и большинство наших приложений работают под управлением Oracle Forms 6i. Я обнаружил, что все запросы, написанные в представлениях/пакетах/процедурах/функциях, являются таблицами JOINING на уровне предложения WHERE. Пример

SELECT * FROM
  TABLE_A A,
  TABLE_B B,
  TABLE_C C,
  TABLE_D D
WHERE 
    A.ID=B.ID(+)
AND B.NO=C.NO(+)
AND C.STATUS=D.ID
AND C.STATUS NOT LIKE 'PENDING%'

Этот запрос применим только к ORACLE, так как он имеет квалификатор соединения (+), неприемлемый для других платформ SQL. Приведенный выше запрос эквивалентен:

SELECT * FROM
  TABLE_A A LEFT JOIN TABLE_B B ON A.ID=B.ID
  LEFT JOIN TABLE_C C ON B.NO=C.NO
  JOIN TABLE_D D ON C.STATUS=D.ID
WHERE
      C.STATUS NOT LIKE 'PENDING%'

Ни один из запросов, которые я видел, не написан с соединением, происходящим в предложении FROM.

Мой вопрос можно разделить на три части:

В: Если предположить, что у меня такая же среда Oracle, какой запрос лучше с точки зрения производительности, кеша, загрузки ЦП и т. д. Первый (присоединение в WHERE) или второй (присоединение в FROM)

В: Существует ли какая-либо другая реализация SQL, которая принимает квалификатор соединения (+), кроме oracle? если да, то какие?

В: Возможно, запись соединения в предложении WHERE делает запрос более читаемым, но ставит под угрозу возможность соединения ВЛЕВО/ВПРАВО, поэтому (+) было для. Где можно подробнее прочитать о происхождении этого (+) и почему он был придуман именно для Oracle?


Ответы:


1

Q1. Нет разницы. Вы можете проверить это с помощью профилирования и сравнить план выполнения.

Q2. Насколько я знаю, его поддерживает только оракул. Но не рекомендуется использовать в последней версии Oracle RDBMS:

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

Q3. Oracle «изобретает» (+) до того, как в SQL ANSI было указано внешнее соединение.

25.11.2013

2

Разницы в производительности быть не должно. Предполагая, что вы используете относительно недавнюю версию Oracle, Oracle неявно преобразует синтаксис SQL 99 в эквивалентный синтаксис, специфичный для Oracle. Конечно, во всем программном обеспечении есть ошибки, поэтому возможно, что одно или другое будет работать по-разному из-за какой-то ошибки. Чем новее версия Oracle, тем меньше вероятность того, что вы заметите разницу.

Оператор (+) (и множество других операторов внешнего соединения в других базах данных) были созданы, потому что в стандарте SQL не было стандартного способа выражения внешнего соединения до стандарта SQL 99. До этого каждый поставщик создавал свои собственные расширения. Oracle потребовалось еще несколько лет, чтобы поддержать новый синтаксис. Между тем фактом, что ошибки были более распространены в начальных выпусках поддержки SQL 99 (не обычными, но более распространенными, чем сейчас), тем фактом, что продукты должны были продолжать поддерживать старые версии баз данных, которые не поддерживали новый синтаксис, и люди, как правило, довольны старым синтаксисом, сегодня все еще пишется много кода, использующего старый синтаксис Oracle.

25.11.2013

3

A1:

Насколько я знаю, они различаются по синтаксису, а не по производительности. Таким образом, нет никакой разницы между присоединением к предложению «где» и присоединением к предложению «от».

A2:

Чтобы лучше ответить на этот вопрос, предложение «Joining at FROM» является стандартным для всех платформ. Так что забудьте о символах (+)

A3 Иногда я работал в Oracle. Люди используют символы (+) для левого/правого соединения, потому что это легко написать. Некоторые пользователи используют предложение join at (FROM), потому что оно более читабельно и понятно.

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

25.11.2013

4

Одно различие между синтаксисом Oracle и синтаксисом ANSI заключается в следующем: в синтаксисе Oracle вы не можете сделать ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, там вы должны использовать синтаксис ANSI.

Oracle представил синтаксис ANSI в Oracle 9i, включая несколько ошибок. В то же время, начиная с Oracle 11 или 12, он работает довольно хорошо, но вы можете обнаружить некоторые препятствия в Oracle 9/10.

Еще одно преимущество синтаксиса соединения ANSI заключается в том, что вы не можете забыть ни одно условие соединения.

"SELECT * FROM TABLE_A, TABLE_B" неявно выполняет перекрестное соединение. "SELECT * FROM TABLE_A JOIN TABLE_B" вызывает ошибку, вы вынуждены указать условие соединения. Если вы хотите использовать Cross-Join, вы должны указать это, т.е. "SELECT * FROM TABLE_A CROSS JOIN TABLE_B"

27.11.2013
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]