Программирование >>  Sql: полное руководство 

1 ... 46 47 48 [ 49 ] 50 51 52 ... 264


в SQL Server. В этой СУБД внешнее объединение обозначается добавлением звездочки (*) к оператору сравнения в предложении where, задающем условие объединения. Для обозначения полного внешнего объединения двух таблиц твы и TBL2 через связанные столбцы соы и C0L2 звездочка (*) ставится слева и справа от оператора;

WHERE C0L1 *=* C0L2

Для обозначения левого внешнего объединения звездочка ставится только слева:

WHERE C0L1 *= C0L2

а правого внешнего объединения - справа:

WHERE C0L1 =* C0L2

Та же самая нотация используется и с другими операторами сравнения, например:

WHERE C0L1 *>= C0L2

В Oracle также поддерживается операция внешнего объединения, но используется другая система записи. Внешнее объединение в предложении where обозначается знаком плюс в скобках, стояшим справа от имени столбца той таблицы, в которую добавляются строки со значениями null (т.е. вспомогательной таблицы). Условие отбора, определяющее левое внешнее объединение, выглядит таким образом:

WHERE C0L1 = C0L2 (+)

а определяющее правое внешнее объединение - так:

WHERE C0L1 (+) = C0L2

Обратите внимание на то, что знак плюс находится на стороне оператора, противоположной той, на которой находится звездочка, применяемая в нотации SQL Server. Операция полного внешнего объединения в Oracle не поддерживается.

Хотя обе описанные системы записи внешнего объединения относительно удобны, они, тем не менее, несколько обманчивы. Согласно правилам обработки SQL-запроса на выборку, приведенным в табл. 7.1, сначала анализируется предложение from и формируется произведение двух таблиц, а затем из него исключаются строки, не удовлетворяющие условию отбора в предложении where. Но произведение не содержит строк со значением null, входяших во внешнее объединение! Ведь предложение from не говорит СУБД о том, какое объединение - внутреннее или внешнее - строить. Как эти строки попадают в результаты запроса? Ответ состоит в том, что при формировании произведения СУБД вынуждена обращаться к предложению where, чтобы выяснить, следует ли включать в произведение строки со значением null. Кроме того, две таблицы могут объединяться с помощью более чем одной пары связанных столбцов, и не ясно, как система записи должна использоваться, если имеются две или три пары связанных столбцов.

Проблемы с записью внешних объединений возникают также при расширении объединения до трех и более таблиц. Понятие внешнего объединения можно легко расширить на три таблицы:

твы операция внешнего объединенмя TBL2 операция внешнего объединения TBL3

С точки зрения теории реляционных баз данных, это вполне допустимая последовательность операций. Но результат зависит от порядка выполнения операций внешнего объединения. Результат объединения

(1:ЪЬуоперация внешнего объединения TBL2) операция внешнего объединения TBL3



в общем случае отличается от объединения

ТВЫ операция внешнего объелинения (TBL2 операция внешнего объединения TBL3)

С помощью систем записи SQL Server или Oracle невозможно определить порядок выполнения внещних объединений. Из-за этого результаты внещнего объединения трех или более таблиц зависят от особенностей реализации конкретной СУБД.

Объединения и стандарт $QL2

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

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

Этих преимуществ удалось добиться за счет значительного усложнения прежде одного из самых простых разделов языка SQL. По сути, расширенная поддержка объединений является частью значительного расширения возможностей запросов в SQL2 в целом. Стало возможным выполнять операции над результатами запроса как над множествами (сложение, пересечение, вычитание таблиц) и применять выражения, манипулирующие строками, таблицами и подчиненными запросами. Более подробно об этом будет говориться в следующих главах.

Внутренние объединения в стандарте SQL2 *

На рис. 7.13 в упрощенном виде изображена синтаксическая диаграмма предложения from в стандарте SQL2. Изучить все ее варианты легче всего, рассматривая По очереди каждый тип объединения. Например, стандартное внутреннее объединение таблиц girls и boys на языке SQL1 можно выразить так:

SELECT *

FROM GIRLS, BOYS WHERE GIRLS.CITY = BOYS.CITY



FROM

-спецификация 1паблицы - -

- выражение ествственного объединения выражение объединения-

-выражеиие перекрестного объединеиия

выражение расширенного запроса на объединение

выраженив вствстввнного объвдинвния - таблица Г NATURAL

-INNER -FULL-

выраженив объвдинвния - таблица/

-LEFT - RIGHT-

LOUTER

JOIN таблицаг-

- INNER

- FULL -

- LEFT-

- RIGHT-

-OUTER-

JOIN таблицаг -т- ON условие

- USING (список столбцов.

выражен ив пврекрвстного объвди нения

- таблица1- CROSS JOIN - таблицаг

выражвние расширенного запроса на объединвние

- таблица1- UNION JOIN - таблицаг

Рис 7 13 Расширенное прейАоженив WROM в стандарте SQL2

В стандарте SQL2 это по-прежнему допустимая инструкция. Создатели стандарта SQL2 не могли отказаться от подобного синтаксиса, так как он применяется в миллионах работающих приложений. Тем не менее, инструкцию можно также записать следующим образом:

SELECT *

FROM GIRLS INNER JOIN BOYS ON GIRLS.CITY = BOYS.CITY

Обратите внимание на то, что две таблицы объединяются явно посредством операции JOIN, а условие отбора, описывающее объединение, находится теперь в предло51сении ON внутри предложения FROM. В условии отбора могут быть заданы



1 ... 46 47 48 [ 49 ] 50 51 52 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика