Главная » Microsoft SQL Server, Базы данных » Использование слияний

0

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

?               Имена столбцов или псевдонимов должны быть определены в первой инструкции SELECT.

?               Все инструкции SELECT должны иметь одинаковое число столбцов, и каждая линейка столбцов должна использовать типы данных из одного семейства.

?               В инструкции SELECT можно добавлять выражения, определяющие источник строк, если данный столбец включен во все инструкции SELECT.

?               Слияния можно использовать как часть инструкции SELECT INTO (эту форму глагола вставки мы подробно рассмотрим в главе 16), однако ключевое слово INTO должно находиться в первой инструкции SELECT.

?               Если для инструкции SELECT по умолчанию определено все множество строк (ALL) и не определено иное, то для слияния можно утверждать обратное. Результатом слияния являются уникальные строки. Если вы хотите изменить этот режим, следует явно указать ключевое слово ALL.

?               Предложение ORDER BY сортирует результаты всех инструкций SELECT, однако при этом использует имена столбцов из первой инструкции SELECT.

В следующем запросе слияния предложение ORDER BY обращается к столбцу Thingl первой инструкции SELECT:

SELECT OnePK, Thingl, ‘из таблицы One1 as Source

FROM dbo.One UNION ALL

SELECT TwoPK, Thing2, ‘из таблицы Two’

FROM dbo.Two ORDER BY Thingl

Результирующий набор данных использует имена столбцов из первой инструкции SELECT: OnePK              Thingl     Source

4              Blue Thing                     из таблицы One

3              Car                                 из таблицы Two

4              Cycle                              из таблицы Two

2              New Thing                     из таблицы One 1 Old Thing из таблицы One

1              Plane                              из таблицы Two

3              Red Thing                      из таблицы One

2              Train                              из таблицы Two

Слияния не ограничены всего двумя таблицами — лично мне однажды приходилось работать с 90 таблицами (впоследствии такой подвиг я больше не повторял). На самом деле общее количество таблиц, на которые ссылается запрос, может доходить до 256, и SQL Server успешно справляется с такой нагрузкой.

Слияние пересечения

Слияние пересечения ищет строки, общие для обоих наборов данных. Внутреннее объединение ищет соответствия по горизонтали, а слияние пересечения — по вертикали. SQL Server не рассматривает пересечение и разность как “родные” операции, поэтому они несколько увеличивают нагрузку. Чтобы подготовить базис для примера, вначале дополним таблицу Two двумя строками, создающими пересечение:

INSERT dbo.Two(TwoPK, OnePK, Thing2)

VALUES(5,0, ‘Red Thing’)

INSERT dbo.Two(TwoPK, OnePK, Thing2)

SELECT Thingl FROM dbo.One INTERSECT SELECT Thing2 FROM dbo.Two ORDER BY Thingl

Результат будет следующим:

Thingl

Blue Thing Red Thing

Запрос слияния пересечения аналогичен внутреннему объединению; в нем каждый столбец участвует в условии ON. Однако запрос слияния пересечения отображает пустые значения как общие и включает такие строки в пересечение, в то время как внутреннее объединение трактует пустые значения как разные и не связывает две строки, содержащие их.

Ключевые слова intersect и except впервые появились в версии SQL Server 2005. Несмотря на то что получить корректные результаты для слияний пересечения и разности можно было и в версии SQL Server 2000, в программах приходилось прибегать к обходным маневрам.

Слияние разности/Except

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

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

SQL Server 2005 для выполнения слияния разности использует ключевое слово EXCEPT стандарта ANSI:

SELECT Thingl FROM dbo.One EXCEPT

SELECT Thing2 FROM dbo.Two ORDER BY Thingl

Результат будет следующим:

Thingl

New Thing Old Thing

Резюме

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

Несмотря на то что появились технологии .NET и CLR, манипулирование данными с помощью инструкций SELECT остается ключевой технологией SQL Server. И хотя объединения являются более естественным методом работы с реляционными данными, подзапросы открывают многочисленные возможности реализации творческого подхода к извлечению данных из множества источников.

В следующей главе мы рассмотрим ряд способов использования подзапросов в теле запроса. Там же будет представлена новая функция SQL Server — общие табличные выражения (СТЕ).

Включение данных с помощью подзапросов и СТЕ

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

Источник: Нильсен, Пол. Microsoft SQL Server 2005. Библия пользователя. : Пер. с англ. — М. : ООО “И.Д. Вильямс”, 2008. — 1232 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии