Программирование >>  Построение запросов sql 

1 ... 35 36 37 [ 38 ] 39 40 41 ... 101


SELECT DISTINCT A.Fio AS Fio Abonent, E.Fio AS Fio Executor FROM Abonent A, Executor E, Request R

WHERE R.AccountCD = A.AccountCD AND R.ExecutorCD = E.ExecutorCD;.

Результат выполнения запроса представлен на рис. 3.67.

FIO ABONENT

FIO EXECUTOR

АКСЕНОВ С.А.

СТАРОДУБЦЕВ Е.М.

АКСЕНОВ С.А.

ШКОЛЬНИКОВ С.М.

АКСЕНОВ С.А.

ШЛЮКОВ М.К.

ДЕНИСОВА Е.К.

БУЛГАКОВ Т.И.

ДЕНИСОВА Е.К.

ШКОЛЬНИКОВ С.М.

КОНЮХОВ В.С.

СТАРОДУБЦЕВ Е.М.

ЛУКАШИНА Р.М.

СТАРОДУБЦЕВ Е.М.

МИЩЕНКО Е.В.

БУЛГАКОВ Т.И.

МИЩЕНКО Е.В.

СТАРОДУБЦЕВ Е.М.

МИЩЕНКО Е.В.

ШЛЮКОВ М.К.

МИЩЕНКО Е.В.

ШУБИН В.Г.

СВИРИНА З.А.

ШУБИН В.Г.

СТАРОДУБЦЕВ Е.В.

СТАРОДУБЦЕВ Е.М.

СТАРОДУБЦЕВ Е.В.

ШКОЛЬНИКОВ С.М.

ТИМОШКИНА Н.Г.

ШЛЮКОВ М.К.

ШМАКОВ С.В.

СТАРОДУБЦЕВ Е.М.

ШУБИНА Т.П.

ШУБИН В.Г.

Рис. 3.67. Результат выполнения запроса на соединение трех таблиц 3.3.1.2. Явное соединение таблиц

Как уже было отмечено, другим способом связывания таблиц является явное соединение, осуществляемое с помощью предложения JOIN. Формат предложения FROM при таком соединении таблиц имеет следующий вид: FROM {<таблица1> [псевдоним1] <тип соединения1> <таблица2> [псевдоним2] [ { ON <условие соединения1> USING (<список столбцов>) }] }

<тип соединения2> <таблица3> [псевдонимЗ] [ { ON <условие соединения2> USING (<список столбцов>)

<тип соединения>::= {CROSS JOIN

[NATURAL] [{INNER {LEFT RIGHT FULL} [OUTER]}] JOIN }.

Таким образом, существуют различные типы явного соединения таблиц.

1. Перекрестное соединение CROSS JOIN используется без конструкции

ON <условие соединения>. CROSS JOIN эквивалентно декартовому произведению таблиц. То есть конструкция FROM A CROSS JOIN B полностью эквивалентна конструкции FROM A, B.

2. Уточненные соединения, которые предполагают явное задание условия соединения после ON или имен столбцов, по которым производится



соединение, после USING:

а) INNER JOIN - внутреннее соединение. В таблицах соединяются только те строки, для которых выполняется <условие соединения>;

б) OUTER JOIN - внешнее соединение. Данное ключевое слово является необязательным и имеет смысл только в комбинации с ключевым словом определения типа внешнего соединения. Внешнее соединение бывает трех типов:

- LEFT (OUTER) JOIN - левое (внешнее) соединение. Это означает, что в результат запроса будут включены все строки левой таблицы и только те строки правой таблицы, для которых выполняется <условие соединения>. Для строк из левой таблицы, для которых не найдено соответствия в правой таблице, в столбцы, извлекаемые из правой таблицы, заносятся значения NULL;

- RIGHT (OUTER) JOIN - правое (внешнее) соединение. Это означает, что в результат запроса будут включены все строки правой таблицы и только те строки левой таблицы, для которых выполняется <условие соединения>. Для строк из правой таблицы, для которых не найдено соответствия в левой таблице, в столбцы, извлекаемые из левой таблицы, заносятся значения NULL;

- FULL (OUTER) JOIN - полное (внешнее) соединение. Это комбинация левого и правого соединений таблиц.

Если не указан тип соединения в предложении JOIN, то он по умолчанию принимается за INNER.

3. Естественное соединение (доступно только для БД на диалекте 3). Стандарт SQL определяет это соединение как результат соединения таблиц по всем одноименным столбцам. Если одноименных столбцов нет, выполняется перекрестное соединение CROSS JOIN. Естественное соединение не требует задания каких-либо условий после ON. Может применяться при внутреннем и внешнем соединении таблиц. В уточненных явных соединениях <условие соединения>, указываемое после ON, аналогично рассмотренному выше условию соединения в предложении WHERE. При соединении данных из нескольких таблиц конструкции JOIN и WHERE взаимозаменяемы. Однако зачастую конструкция JOIN является более удобной для понимания. Например, конструкция JOINON дает возможность отличать условие соединения, указываемое после ON, от условия поиска, указываемого в предложении WHERE.

Например, необходимо вывести для всех абонентов названия и коды улиц, на которых они проживают. Решение этого примера на основе конструкции WHERE было приведено ранее (результат на рис. 3.64). Реализация этого запроса посредством явного соединения таблиц будет иметь вид: SELECT A.Fio, S.StreetCD, S.StreetNM FROM Abonent A INNER JOIN Street S ON A.StreetCD = S.StreetCD;. Если в этом же примере использовать правое внешнее соединение, то получится список всех улиц и проживающих на них абонентов, если таковые



имеются. Запрос будет выглядеть следующим образом: SELECT A.Fio, S.StreetCD, S.StreetNM FROM Abonent A RIGHT JOIN Street S ON A.StreetCD = S.StreetCD;.

Результат выполнения запроса представлен на рис. 3.68.

STREETCD

STREETNM

АКСЕНОВ С.А.

ВОИКОВ ПЕРЕУЛОК

МИЩЕНКО Е.В.

ВОИКОВ ПЕРЕУЛОК

КОНЮХОВ В.С.

ВОЙКОВ ПЕРЕУЛОК

ТУЛУПОВА М.И.

КУТУЗОВА УЛИЦА

СВИРИНА З.А.

КУТУЗОВА УЛИЦА

ТИМОШКИНА Н.Г.

МОСКОВСКАЯ УЛИЦА

ЛУКАТИНА РМ

МОСКОВСКОЕ ШОССЕ УЛИЦА

ШУБИНА Т.П.

МОСКОВСКОЕ ШОССЕ УЛИЦА

СТАРОДУБЦЕВ Е.В.

ТАТАРСКАЯ УЛИЦА

ШМАКОВ С.В.

ТАТАРСКАЯ УЛИЦА

МАРКОВА В.П.

ТАТАРСКАЯ УЛИЦА

ДЕНИСОВА Е.К.

ТАТАРСКАЯ УЛИЦА

<null>

ГАГАРИНА УЛИЦА

<null>

ЦИОЛКОВСКОГО УЛИЦА

<null>

НОВАЯ УЛИЦА

Рис. 3.68. Результат правого внешнего соединения

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

Если в данном примере использовать левое внешнее соединение, то результат будет совпадать с результатом внутреннего соединения (рис. 3.64), так как нет абонентов, для которых не указана улица проживания.

Если же использовать полное внешнее соединение, то для данного примера результат будет совпадать с результатом правого внешнего соединения (рис.

3.68).

Следует отметить, что необязательно в качестве имен соединяемых таблиц использовать только явные имена таблиц либо только псевдонимы таблиц. Допускается использовать также и их сочетание. Таким образом, следующий запрос вернет правильный результат:

SELECT Abonent.Fio, S.StreetCD, S.StreetNM FROM Abonent JOIN Street S

ON Abonent.StreetCD = S.StreetCD;. Рассмотрим запрос, в котором используется явное соединение таблиц и условие поиска в предложении WHERE. Например, для выбора фамилий абонентов, которые производили оплату за услугу газоснабжения с кодом 2 позднее 1 октября 2001 года, такой запрос может быть построен следующим образом:

SELECT A.Fio, P.PaySum



1 ... 35 36 37 [ 38 ] 39 40 41 ... 101

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