воскресенье, 12 апреля 2009 г.

Выборка данных из нескольких таблиц

Такая выборка данных предполагает соединение нескольких таблиц для получения единого набора результатов, включающих записи и поля каждой таблицы. Соединение позволяет собрать данные, разделенные в процессе нормализации.
Существует три вида соединений: внутреннее, внешнее и перекрестное. Для объединения трех и более таблиц можно применять последовательность соединений.
Для соединения таблиц необходимо раздел FROM дополнить ключевыми словами JOIN, которое определяет соединяемые таблицы и метод соединения, и ON, указывающее общие для таблиц поля.
5.1. Внутреннее соединение
При таком виде соединения сравниваются значения общих полей двух таблиц, возвращаются только записи, удовлетворяющие критерию связывания в обеих таблицах. Записи, для которых не имеется пары в связанной таблице, в результат не включаются.
Например, в таблице DimProduct нормализованной базы данных AdventureWorksDW храниться только идентификатор субкатегории товара. Чтобы получить список товаров с указанием их субкатегорий, необходимо соединить таблицы DimProduct и DimProductSubcategory:

SELECT DimProduct.EnglishProductName, DimProductSubcategory.EnglishProductSubcategoryName
FROM DimProduct INNER JOIN DimProductSubcategory
ON DimProduct.ProductSubcategoryKey=DimProductSubcategory.ProductSubcategoryKey

При таком соединении товары, для которых не указана их субкатегория, не включаются в набор результатов.

При соединение трех таблиц A, B и C конечный набор результатов получается посредством соединения третьей таблицы С с результатом соединения первых двух таблиц A и B:
FROM (A INNER JOIN B ON …) INNER JOIN C ON …

Задание 1. Вывести имена и фамилии заказчиков, сделавших заказы через Интернет, с указанием даты заказов. Причем вывести только тех, кто сделал заказ не раньше июня 2004 года. Если заказчик размещает несколько заказов в один день, то должна быть выведена только одна запись.
Подсказка: информация о заказах через Интернет – в таблице FactInternetSales, дата заказа содержится в таблице DimTime в поле FullDateAlternateKey.

5.2. Внешнее соединение
Такое соединение также возвращает объединенные записи, соответствующие условию соединения. Однако левые и правые соединения возвращают записи и не соответствующие указанному условию соединения. Такие соединения применяются для получения полного набора записей одной из таблиц.
При левом соединении (ключевое слово LEFT JOIN) в результат будут включены все записи левой таблицы (имя которой расположено слева от LEFT JOIN), независимо от того, есть для них соответствующая запись в правой таблице (имя таблицы расположено справа от LEFT JOIN) или нет.
Например, если в примере из предыдущего пункта вместо INNER JOIN поставить LEFT JOIN, то для товаров, у которых нет субкатегории, в поле EnglishProductSubcategoryName будет содержаться значение NULL.

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

Задание 2. Получите список товаров с указанием их субкатегорий (см. пример) с помощью внутреннего, левого и правого соединений. Сравните результаты.

5.3. Перекрестное соединение (произведение)
При таком соединении (ключевое слово CROSS JOIN) выводятся все комбинации записей таблиц, при этом не требуется указание совпадающих значений полей, поэтому условие ON опускается.
В нормализованных базах данных перекрестные соединения чаще всего используются для получения списка всех возможных комбинаций записей двух таблиц, т.е. число записей итогового набора равняется произведения числа записей первой таблицы на число записей второй.
Например, с помощью перекрестного соединения можно перечислить все возможные виды валюты для оплаты всех наименований товаров:

SELECT EnglishProductName, CurrencyName
FROM DimProduct CROSS JOIN DimCurrency

Задание 3. Перечислить все возможные виды валюты для оплаты всех наименований товаров (см. пример), причем не выводить дважды одинаковые записи и отсортировать по алфавиту наименований товаров. Проверьте, равно ли количество строк результата произведению количеств строк таблиц DimProduct и DimCurrency.

5.4. Объединение нескольких наборов результатов
Оператор UNION объединяет результаты двух и более операторов SELECT и применяется в случае, когда данные нельзя получить при помощи одного запроса.
Для получения единого итогового набора данных необходимо написать отдельные операторы SELECT и объединить их при помощи оператора UNION, при этом, в отличие от соединения, записи в итоговый набор добавляются друг за другом:

SELECT СписокПолейПервойТаблицы
FROM ИмяПервойТаблицы
UNION [ALL]
SELECT СписокПолейВторойТаблицы
FROM ИмяВторойТаблицы
[,…]

По умолчанию повторяющиеся записи удаляются, для получения всех записей необходимо указать ключевое слово ALL. Необходимо так же учитывать, что список полей, порядок и все их свойства должны быть одинаковы во всех используемых запросах (совместимость по типу).
Имена полей итогового набора берутся из первого запроса, поэтому создание псевдонимов полей выполняется в нем. Для получения отсортированного набора данных раздел ORDER BY указывается после последнего оператора SELECT.

Задание 4. Получить единый набор данных содержащий фамилии и имена заказчиков и сотрудников, а также их e-mail.




Задание 5. Получить список товаров с указанием номера заказа и наименования промоутера, заказанных в определенный день, например, 1 января 2004 года. Решение оформите в виде хранимой процедуры (дата – входной параметр).

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

А отдых в Турции в этом году будет гораздо доступнее из-за снижения цен
Великолепный отдых в коттеджах Норвегии запомнится вам надолго!