|
MS SQL Server - Объединения ANSI
SQL Server поддерживает объединения стандарта ANSI. В объединениях ANSI тип и условие объединения задаются в секции FROM. Стандарт ANSI поддерживает внутренние, внешние и ортогональные объединения. В отличие от расширенных объединений TSQL, объединения ANSI допускают использование таблицы в качестве как внутренней, так и внешней таблицы объединения.
Ортогональные объединения идентифицируются ключевыми словами CROSS JOIN между именами таблиц в секции FROM. При выполнении ортогонального объединения нельзя задавать никаких условий. Внутреннее объединение идентифицируется ключевыми словами INNER JOIN между таблицами, а внешнее объединение — типом LEFT, RIGHT или FULL, за которым следует необязательное ключевое слово OUTER, а затем — ключевое слово JOIN (например, LEFT OUTER JOIN).
Для внутренних и внешних объединений должно быть задано условие объединения. Условие сокращает количество возвращаемых записей. Одна секция может содержать несколько условий, объединенных с помощью ключевых слов AND и OR. Как видно из листинга 6.11, условие объединения похоже на другие условия секции WHERE.
FROM title t INNER JOIN titleauthor ta ON t.title_id = ta.title_id
AND ta.au_id > 10
FROM author a LEFT OUTER JOIN titleauthor ON a.au_id = ta.au_id
INNER JOIN title t ON t.title_id = ta.title_id
AND t.ytd_sales > 4000
Предыдущий пример показывает, как в синтаксисе JOIN стандарта ANSI реализуется объединение нескольких условий. Следующие примеры демонстрируют различные типы объединений ANSI. Первый пример создает ортогональное объединение:
SELECT * FROM titles t CROSS JOIN titleauthor ta
Команда возвращает все записи из таблиц title и titleauthor. Общее число возвращаемых записей равно произведению количества записей в title и titleauthor. Следующая команда выполняет внутреннее объединение:
SELECT * FROM titles t INNER JOIN titleauthor ta
ON t.title_id = ta.title_id
Команда возвращает только те записи, в которых содержимое title_id совпадает в таблицах titles и titleauthor. Последний пример демонстрирует внешнее объединение:
SELECT * FROM titles t LEFT OUTER JOIN titleauthor ta
ON t.title_id = ta.title_id -- левое внешнее объединение
Возвращаются все записи titles даже в том случае, если для title_id не находится соответствующего значения title_id в titleauthor.
SELECT * FROM titles t FULL OUTER JOIN titleauthor ta
ON t.title_id = ta.title_id -- полное внешнее объединение
В этом примере показано полное внешнее объединение; возвращаются все записи titles и titleauthor даже в том случае, если условие не выполняется. Синтаксис объединений ANSI читается намного проще, чем синтаксис TSQL. В нем сразу видно, какие таблицы объединяются и как выглядит условие объединения. Возможно, расширенные объединения TSQL не будут поддерживаться будущими версиями SQL Server.
|