|
Страница 1 из 5 ANSI-стандарт SQL-соединений Новые возможности SQL-соединений в Oracle9i упрощают обычные соединения и позволяют создавать полные внешние соединения. Поддержка стандарта SQL/92 для синтаксиса соединений - это одна из множества новых возможностей, которые можно найти в Oracle9i. Эта возможность позволяет легче, чем раньше, создавать переносимые приложения и дает возможность использования полных внешних соединений.
Синтаксис соединений до Oracle9i Исторически база данных Oracle поддерживала синтаксис соединений по стандарту SQL/86. На Листинге 1 показан пример такого соединения. До Oracle9i внешние соединения поддерживались с помощью соответствующего синтаксиса. На Листинге 2 показано внешнее соединение таблиц COURSE и ENROLLMENT. Заметьте, что использование "(+)" в операторе WHERE следует за именами столбцов таблицы ENROLLMENT, для того чтобы сделать эту таблицу дополняющей соединение. Традиционный синтаксис соединения имеет свои недостатки. В сложных запросах часто бывает трудно выполнить синтаксический анализ оператора WHERE для разделения условий соединения и других ограничений, влияющих на результат запроса. И программисты иногда вообще забывают указывать условия соединения, что приводит к возникновению декартова произведения. ANSI-стандарт синтаксиса соединений В ANSI-стандарт синтаксиса SQL-соединений Oracle9i входит несколько новых ключевых слов и операторов, которые позволяют полностью описать соединение только во фразе FROM SELECT-предложения. Рассмотрим задачу соединения таблиц COURSE и ENROLLMENT. При использовании традиционного метода запрос начинается с перечисления двух таблиц во фразе FROM, как показано ниже: FROM courses c, enrollment e А при использовании синтаксиса ANSI можно обойтись без запятых и вместо этого явно указать тип требуемого соединения. Для создания внутреннего соединения между таблицами COURSE и ENROLLMENT следует написать: FROM courses c INNER JOIN enrollment e Другие рекомендации Джонатан Генник предоставляет на сайте http://gennick.com После описания типа соединения описываются условия этого соединения. Вместо того чтобы смешивать условия соединения с другими ограничениями фразы WHERE, условия соединения описываются в операторе ON, который является частью фразы FROM: SELECT c.course_name, c.period, e.student_name FROM course c INNER JOIN enrollment e ON c.course_name = e.course_name AND c.period = e.period; Хотя вы и привыкли к старому синтаксису, в новом синтаксисе есть свои особенности. И его стоит попытаться изучить, так как у него есть некоторые свои достоинства: * Вся информация о соединении располагается в одном месте. Чтобы отделить условия соединения от ограничений результатов запроса, больше не нужно формировать сложную фразу WHERE. * Вы не сможете "забыть" описать условия соединения. Если, например, указано, что соединение внешнее, то Oracle9i затребует, чтобы использовался оператор ON - или другой оператор - для явного описания условия соединения. Если требуется полное декартово произведение, то его необходимо задать явно. * Теперь можно создавать полное внешнее соединение, что невозможно было сделать средствами более раннего синтаксиса соединения, используемого в Oracle. * Не нужно беспокоиться о пропуске "(+)," невнимание к которому преобразовывает внешнее соединение во внутреннее. Описание условий соединения Итак, оператор ON используется для описания условий соединения: SELECT c.course_name, c.period, e.student_name FROM course c INNER JOIN enrollment e ON c.course_name = e.course_name AND c.period = e.period; Приобрести документацию по ANSI-стандарту для SQL можно в webstore.ansi.org Оператор ON позволяет описать любое булево выражение как условие соединения. Однако большинство соединений связываются по равенству. В соединении по равенству соответствующие столбцы двух таблиц сравниваются на эквивалентность. Поэтому если столбцы, описывающие соединение, названы в двух таблицах одинаково, то можно воспользоваться преимуществом некоторого упрощенного синтаксиса, который также улучшает понимание запроса. Вместо оператора ON для описания выражения можно перечислить столбцы соединения в операторе USING. Вместо того чтобы написать: ON c.course_name = e.course_name AND c.period = e.period; Можно просто использовать оператор USING: USING (course_name, period); Оператор USING в этом примере описывает, какие строки двух таблиц должны соединяться, когда в соответствующих столбцах этих таблиц COURSE_NAME и PERIOD появляются одинаковые значения. На Листинге 3 показан пример соединения по равенству с использованием оператора USING. Из этого примера видно, что предложение SELECT короче и проще для понимания. Однако в операторе USING слегка затрагивается семантика запроса. При написании соединения с помощью оператора ON все столбцы обоих таблиц доступны. Таким образом, столбец COURSE_NAME можно выбирать из обоих таблиц: SELECT C.COURSE_NAME, E.COURSE_NAME
|