|
MS SQL Server - Объединение таблиц.
Довольно часто данные, которые требуется извлечь, находятся в нескольких таблицах. Конструкция JOIN позволяет создать объединение, то есть выбрать данные из многих (до 256) таблиц, представлений или производных таблиц.
• Не допускается прямое объединение столбцов типа NTEXT, TEXT и IMAGE. • Если таблица объединяется сама с собой, для нее необходимо создать псевдоним. • Подзапросы являются особым случаем объединения данных нескольких таблиц в одной команде SELECT.
Объединения делятся на три типа: ортогональные, внутренние и внешние.
Ортогональные объединения
Ортогональное объединение, также называемое «декартовым произведением», возвращает все записи из всех объединяемых таблиц. Общее количество возвращаемых записей равно произведению количества записей в каждой из таблиц. Предположим, в объединении участвуют три таблицы. Первая таблица возвращает 30 000 записей, а остальные — по 1000 записей каждая. Общее число записей, возвращаемых ортогональным объединением, будет равно 30 000*1000*1000, или 30 000 000 000 записей. Конечно, при организации ортогональных объединений следует быть очень осторожными. Примеры ортогональных объединений приведены в следующем фрагменте:
SELECT * FROM titles CROSS JOIN titleauthor
SELECT * FROM titles, titleauthor
Первая команда создает стандартное ортогональное объединение таблиц titles и titleauthor в стандарте ANSI. Вторая команда делает то же самое, но с применением расширений TSQL.
Внутренние объединения
Внутреннее объединение является самым распространенным видом объединений. В нем используется оператор сравнения, ограничивающий число возвращаемых записей. Во внутреннем объединении вы задаете общие столбцы (называемые общими ключами), используемые для связи таблиц. Пример внутреннего объединения показан в следующем фрагменте:
SELECT * FROM titles, titleauthor
WHERE titles.title_id = titleauthor.title_id
Внешние объединения
Внешние объединения тоже используются для связывания таблиц, однако результат возвращается в том случае, когда условие объединения не выполняется. Внешние объединения делятся на три типа: левые, правые и полные.
Левое внешнее объединение
Левое внешнее объединение возвращает все записи левой таблицы объединения даже в том случае, если записи в правой таблице не существуют. Если условие объединения не выполняется, столбцы правой таблицы заполняются неопределенными значениями NULL. Пример левого внешнего объединения приведен в следующем фрагменте:
SELECT * FROM titles, titleauthor
WHERE titles.title_id *= titleauthor.title_id
Команда возвращает все записи левой таблицы (titles) даже в том случае, если соответствующие записи правой таблицы (titleauthor) не существуют.
Правое внешнее объединение
Правое внешнее объединение возвращает все записи правой таблицы объединения даже в том случае, если записи в левой таблице не существуют. Если условие объединения не выполняется, столбцы правой таблицы заполняются неопределенными значениями NULL. Пример левого внешнего объединения приведен в следующем фрагменте:
SELECT * FROM titles, titleauthor
WHERE titleauthortitles.title_id =* titles.title_id
Команда возвращает все записи правой таблицы (titles) даже в том случае, если соответствующие записи левой таблицы (titleauthor) не существуют.
Полное внешнее объединение
Полное внешнее объединение возвращает все записи левой и правой таблиц даже в том случае, если условие не выполняется. Там, где между таблицами находится совпадение, все столбцы заполняются соответствующими значениями. При отсутствии совпадения возвращаются значения одной таблицы и NULL — для столбцов другой таблицы.
В SQL Server существуют два вида объединений: стандартные объединения ANSI и расширенные объединения T-SQL. Оба вида могут одновременно присутствовать в команде SELECT, хотя это не рекомендуется.
|