|
Программирование >> Построение запросов sql
FROM Abonent A JOIN PaySumma P ON A.AccountCD = P.AccountCD WHERE GazServiceCD=2 AND PayDate > 01.10.2001;. Результат выполнения запроса представлен на рис. 3.69.
Рис. 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.
Рис. 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;.
Рис. 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.
Рис. 3.72. Эквисоединение таблиц Abonent и Street
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |