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

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


FROM Abonent A JOIN PaySumma P

ON A.AccountCD = P.AccountCD WHERE GazServiceCD=2 AND PayDate > 01.10.2001;.

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

PAYSUM

АКСЕНОВ С. А.

58,70

МИЩЕНКО Е.В.

250,00

ШУБИНА Т.П.

80,00

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

46,00

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

58,70

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

80,00

Рис. 3.69. Результат наложения дополнительных условий поиска для

соединяемых таблиц

Для БД на диалекте 3 существует возможность более простого, по сравнению с конструкцией ON, задания условия соединения - соединение по именам столбцов. Если таблицы соединяются по одноименным столбцам, то можно использовать конструкцию USING (<список столбцов>). В <списке столбцов> указываются имена всех столбцов, по значениям в которых требуется соединить таблицы.

При создании соединения по именам столбцов следует помнить следующее:

- все столбцы, указанные в списке столбцов, должны существовать в соединяемых таблицах;

- по всем указанным столбцам автоматически создается такое соединение, как если бы было указано

<таблица1>.столбец = <таблица2>.столбец

в предложении WHERE при неявном соединении или после ON при явном соединении.

Например, рассмотренный ранее запрос, выводящий для всех абонентов названия и коды улиц, можно реализовать с использованием конструкции

USING:

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

USING (StreetCD);.

Этот же запрос можно реализовать с помощью естественного соединения: SELECT A.Fio, S.StreetCD, S.StreetNM FROM Abonent A NATURAL JOIN Street S;.

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

Например, вывести адреса и ФИО абонентов, проживающих на улицах, наименования которых начинаются с букв Г или М, указав для каждого абонента значения начислений, можно с помощью следующего запроса: SELECT S.StreetNM,(д.A.HouseNo) AS House,



(кв.A.FlatNo) AS Flat,

A.Fio,

N.NachislSum,

(N.NachislMonth месяц N.NachislYear года) AS

Period

FROM (Abonent A RIGHT JOIN Street S

ON A.StreetCD = S.StreetCD) FULL JOIN NachislSumma N ON A.AccountCD = N.AccountCD WHERE (S.StreetNM LIKE М%) OR (S.StreetNM LIKE Г%) ORDER BY N.NachislYear DESC, N.NachislMonth DESC;. Результат выполнения запроса представлен на рис. 3.70.

STREETNM

HOUSE

FLAT

NACHISLSUM

PERIOD

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

д.35

кв.6

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

46,00

12 месяц 2001 года

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

д.39

кв.36

ШУБИНА Т.П.

80,00

10 месяц 2001 года

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

д.39

кв.36

ШУБИНА Т.П.

32,56

9 месяц 2001 года

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

д.35

кв.11

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

56,00

6 месяц 2001 года

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

д.35

кв.6

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

60,10

5 месяц 2001 года

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

д.35

кв.6

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

58,10

12 месяц 2000 года

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

д.35

кв.11

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

12,60

8 месяц 2000 года

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

д.35

кв.11

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

22,86

4 месяц 2000 года

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

д.39

кв.36

ШУБИНА Т.П.

22,20

7 месяц 1999 года

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

д.39

кв.36

ШУБИНА Т.П.

22,56

5 месяц 1999 года

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

д.39

кв.36

ШУБИНА Т.П.

80,00

10 месяц 1998 года

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

д.35

кв.11

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

10,60

9 месяц 1998 года

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

д.35

кв.11

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

12,60

4 месяц 1998 года

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

д.39

кв.36

ШУБИНА Т.П.

19,56

3 месяц 1998 года

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

д.35

кв.6

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

57,10

2 месяц 1998 года

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

<null>

<null>

<null>

<null>

<null>

Рис. 3.70. Результат соединения трех таблиц

В ТРЗ включена и ГАГАРИНА УЛИЦА, на которой не проживают абоненты, так как сначала выполнялось правое внешнее соединение таблиц Abonent и Street, а затем полное внешнее соединение полученной таблицы с таблицей NachislSumma. Итоговый результат отсортирован по убыванию года начислений, а внутри года - по убыванию месяца.

3.3.1.3. Стандартные соединения (объединения) таблиц 3.3.1.3.1. Декартово произведение

Для получения декартова произведения таблиц в предложении FROM необходимо указать перечень перемножаемых таблиц, а в предложении SELECT - все их столбцы. Перемножим таблицы Abonent (12 строк) и Street (8 строк) и получим результирующую таблицу (96 строк): SELECT Abonent.*, Street.*

FROM Abonent, Street;.



ACCOUNTCD

STREETCD

HOUSENO

FLATNO

PHONE

STREETCD1

STREETNM

005488

АКСЕНОВ С.А.

556893

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

115705

МИЩЕНКО Е.В.

769975

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

015527

КОНЮХОВ В.С.

761699

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

005488

АКСЕНОВ С.А.

556893

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

115705

МИЩЕНКО Е.В.

769975

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

015527

КОНЮХОВ В.С.

761699

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

080047

ШУБИНА Т.П.

257842

НОВАЯ УЛИЦА

080270

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

321002

НОВАЯ УЛИЦА

Рис. 3.71. Декартово произведение таблиц Abonent и Street

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

SELECT Abonent.*, Street.*

FROM Abonent CROSS JOIN Street;.

Таким образом, декартово произведение двух таблиц - это набор всевозможных комбинаций строк из двух таблиц.

3.3.1.3.2. Эквисоединение

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

Например, запрос на неявное эквисоединение таблиц Abonent и Street будет выглядеть следующим образом:

SELECT Abonent.*, Street.*

FROM Abonent, Street

WHERE Abonent.StreetCD = Street.StreetCD;.

Фрагмент результата выполнения запроса представлен на рис. 3.72.

ACCOUNTCD

STREETCD

HOUSENO

FLATNO

PHONE

STREETCD1

STREETNM

005488

АКСЕНОВ С.А.

556893

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

115705

МИЩЕНКО Е.В.

769975

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

015527

КОНЮХОВ В.С.

761699

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

443690

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

214833

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

136159

СВИРИНА З.А.

350003

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

Рис. 3.72. Эквисоединение таблиц Abonent и Street



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

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