Предложение FROM (Transact-SQL)
Указывает таблицы, представления, производные таблицы и соединяемые таблицы, которые используются в инструкциях DELETE, SELECT и UPDATE. В инструкции SELECT требуется предложение FROM, за исключением тех случаев, когда список выбора содержит только константы, переменные и арифметические выражения (без имен столбцов).
Синтаксис
[ FROM { <table_source> } [ ,...n ] ]
<table_source> ::=
{
table_or_view_name [ [ AS ] table_alias ] [ <tablesample_clause> ]
[ WITH ( < table_hint > [ [ , ]...n ] ) ]
| rowset_function [ [ AS ] table_alias ]
[ ( bulk_column_alias [ ,...n ] ) ]
| user_defined_function [ [ AS ] table_alias ] ]
| OPENXML <openxml_clause>
| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
| <joined_table>
| <pivoted_table>
| <unpivoted_table>
| @variable [ [ AS ] table_alias ]
| @variable.function_call ( expression [ ,...n ] ) [ [ AS ] table_alias ] [ (column_alias [ ,...n ] ) ]
}
<tablesample_clause> ::=
TABLESAMPLE [SYSTEM] ( sample_number [ PERCENT | ROWS ] )
[ REPEATABLE ( repeat_seed ) ]
<joined_table> ::=
{
<table_source> <join_type> <table_source> ON <search_condition>
| <table_source> CROSS JOIN <table_source>
| left_table_source { CROSS | OUTER } APPLY right_table_source
| [ ( ] <joined_table> [ ) ]
}
<join_type> ::=
[ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
JOIN
<pivoted_table> ::=
table_source PIVOT <pivot_clause> [ AS ] table_alias
<pivot_clause> ::=
( aggregate_function ( value_column [ [ , ]...n ])
FOR pivot_column
IN ( <column_list> )
)
<unpivoted_table> ::=
table_source UNPIVOT <unpivot_clause> [ AS ] table_alias
<unpivot_clause> ::=
( value_column FOR pivot_column IN ( <column_list> ) )
<column_list> ::=
column_name [ ,...n ]
Аргументы
<table_source>
Указывает таблицу, представление, табличную переменную или источник производной таблицы с указанием или без указания псевдонима для использования в инструкции Transact-SQL. В инструкции можно использовать до 256 источников таблиц, хотя предел изменяется в зависимости от доступной памяти и сложности других выражений в запросе. Отдельные запросы могут не поддерживать 256 источников таблиц.Примечание Производительность выполнения запросов может снизиться из-за большого количества таблиц, указанных в запросе. На время компиляции и оптимизации также влияют дополнительные факторы. Они включают в себя наличие индексов и индексированных представлений в каждом <table_source> и размер <select_list> в инструкции SELECT.
Порядок источников таблиц после ключевого слова FROM не влияет на возвращаемый результирующий набор. Если в предложении FROM встречаются повторяющиеся имена, SQL Server возвращает ошибки.
table_or_view_name
Имя таблицы или представления.Если таблица или представление существует в другой базе данных в том же экземпляре SQL Server, следует использовать полное имя в виде база_данных.схема.имя_объекта.
Если таблица или представление существует вне экземпляра SQL Server, используйте четырехкомпонентное имя в виде связанный_сервер.каталог.схема.объект. Дополнительные сведения см. в разделе sp_addlinkedserver (Transact-SQL). Для указания удаленного источника таблицы также можно использовать четырехкомпонентное имя, где в качестве компонента сервера используется функция OPENDATASOURCE. Если указана функция OPENDATASOURCE, то аргументы database_name и schema_name могут применяться не ко всем источникам данных, в зависимости от возможностей поставщика OLE DB, который обращается к удаленному объекту. Дополнительные сведения см. в разделе Распределенные запросы.
[AS] table_alias
Псевдоним для table_source, который может использоваться как для удобства, так и для различения таблицы или представления во внутреннем соединении или во вложенном запросе. Псевдоним часто является сокращенным именем таблицы, использующимся для соотнесения с определенными столбцами таблиц в соединении. Если имя столбца существует более чем в одной таблице соединения, SQL Server потребует, чтобы имя столбца было уточнено именем таблицы, представления или псевдонима. Если определен псевдоним, нельзя использовать имя таблицы.При использовании производной таблицы, набора строк или возвращающей табличное значение функции либо предложения оператора (как PIVOT или UNPIVOT) требуемый аргумент table_alias в конце предложения является соответствующим именем таблицы для всех возвращаемых столбцов, включая группирующие столбцы.
WITH (<table_hint>)
Указывает на то, что с данной таблицей и для данной инструкции оптимизатор запросов использует стратегию оптимизации или блокировки. Дополнительные сведения см. в разделе Табличные подсказки (Transact-SQL).rowset_function
Указывает одну из функций набора строк, например OPENROWSET, возвращающую объект, который можно использовать вместо ссылки на таблицу. Дополнительные сведения о списке функций набора строк см. в разделе Функции наборов строк (Transact-SQL).Использование функций OPENROWSET и OPENQUERY для задания удаленного объекта зависит от возможностей поставщика OLE DB, который обращается к удаленному объекту. Дополнительные сведения см. в разделе Распределенные запросы.
bulk_column_alias
Дополнительный псевдоним для замены имени столбца в результирующем наборе. Псевдонимы столбца разрешены только в инструкциях SELECT, использующих функцию OPENROWSET с параметром BULK. При использовании аргумента bulk_column_alias необходимо указать псевдоним для каждого столбца таблицы в том же порядке, что и в файле.Примечание Данный псевдоним, если он присутствует, переопределяет атрибут NAME в элементах COLUMN файла XML.
user_defined_function
Указывает возвращающую табличное значение функцию.OPENXML <openxml_clause>
Обеспечивает представление XML-документа в виде набора строк. Дополнительные сведения см. в разделе OPENXML (Transact-SQL).derived_table
Вложенный запрос, который извлекает строки из базы данных. Аргумент derived_table используется в качестве входной таблицы для внешнего запроса.derived Чтобы указать несколько строк в параметре _table, можно воспользоваться конструктором табличных значений Transact-SQL. Например, SELECT * FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);. Дополнительные сведения см. в разделе Конструктор табличных значений (Transact-SQL).
column_alias
Дополнительный псевдоним для замены имени столбца в результирующем наборе производной таблицы. Для каждого столбца в списке выбора следует включить по одному псевдониму столбца и заключить весь список псевдонимов столбцов в скобки.<tablesample_clause>
Указывает, что из таблицы возвращается выборка данных. Выборка может быть приблизительной. Это предложение может быть использовано в инструкциях SELECT, UPDATE или DELETE в отношении любой первичной или соединяемой таблицы. TABLESAMPLE не может быть указано для представлений. Дополнительные сведения см. в разделе Ограничение результирующего набора с помощью предложения TABLESAMPLE.Примечание Если TABLESAMPLE применяется к базам данных, обновленным до SQL Server, то уровень совместимости базы данных необходимо установить в значение 90 или выше. Сведения о задании уровня совместимости для базы данных см. в разделе Уровень совместимости инструкции ALTER DATABASE (Transact-SQL).
SYSTEM
Зависящий от реализации метод выборки, определенный стандартами ISO. В SQL Server это единственно доступный метод выборки, применяется по умолчанию. SYSTEM использует основанный на страницах метод выборки со случайным набором страниц, все строки которых возвращаются как подмножество выборки. Дополнительные сведения см. в разделе Ограничение результирующего набора с помощью предложения TABLESAMPLE.sample_number
Точное или приближенное константное числовое выражение, представляющее процент или количество строк. При указании PERCENT аргумент sample_number неявно преобразуется в тип float; в противном случае он преобразуется в тип bigint. PERCENT является параметром по умолчанию.PERCENT
Указывает, что из таблицы должен быть извлечен процент строк таблицы, равный значению аргумента sample_number. При указании PERCENT SQL Server возвращает приближенное значение указанного процента. При указании PERCENT аргумент sample_number должен иметь значение от 0 до 100.ROWS
Указывает, что будет извлечено количество строк, приблизительно равное значению sample_number. При указании ROWS SQL Server возвращает приближенное значение количества указанных строк. При указании ROWS результатом выражения sample_number должно быть целочисленное значение больше нуля.REPEATABLE
Указывает, что заданная выборка может быть возвращена снова. При указании такого же значения repeat_seed SQL Server будет возвращать то же подмножество строк до тех пор, пока не будут внесены изменения в какую-либо строку таблицы. При указании другого значения repeat_seedSQL Server, скорее всего, вернет другой образец строк таблицы. Изменениями считаются следующие действия над таблицей: вставка, обновление, удаление, перестроение или дефрагментация индекса, а также восстановление или присоединение базы данных.repeat_seed
Константное целочисленное выражение, используемое SQL Server для формирования случайного числа. Аргумент repeat_seed имеет тип bigint. Если аргумент repeat_seed не указан, SQL Server присваивает значение случайным образом. Для определенного значения аргумента repeat_seed результат выборки всегда тот же, если в таблице не было произведено никаких изменений. Результат выражения repeat_seed должен быть целочисленным значением больше нуля.<joined_table>
Результирующий набор, полученный из двух или более таблиц. Для нескольких соединений следует использовать скобки, чтобы изменить естественный порядок соединений.<join_type>
Указание типа операции соединения.INNER
Указывает, что возвращаются все совпадающие пары строк. Отмена несовпадающих строк из обеих таблиц. Если тип соединения не указан, этот тип задается по умолчанию.FULL [ OUTER ]
Указывает, что в результирующий набор включаются строки как из левой, так и из правой таблицы, несоответствующие условиям соединения, а выходные столбцы, соответствующие оставшейся таблице, устанавливаются в значение NULL. Этим дополняются все строки, обычно возвращаемые при помощи INNER JOIN.LEFT [ OUTER ]
Указывает, что все строки из левой таблицы, не соответствующие условиям соединения, включаются в результирующий набор, а выходные столбцы из оставшейся таблицы устанавливаются в значение NULL в дополнение ко всем строкам, возвращаемым внутренним соединением.RIGHT [ OUTER ]
Указывает, что все строки из правой таблицы, не соответствующие условиям соединения, включаются в результирующий набор, а выходные столбцы, соответствующие оставшейся таблице, устанавливаются в значение NULL в дополнение ко всем строкам, возвращаемым внутренним соединением.<join_hint>
Указывает, что оптимизатор запросов SQL Server использует одну подсказку по применению соединения, или алгоритм выполнения, для каждого соединения, указанного в предложении FROM. Дополнительные сведения см. в разделе Подсказки в соединении (Transact-SQL).JOIN
Указывает, что данная операция соединения должна произойти между указанными источниками или представлениями таблицы.ON <условие_поиска>
Задает условие, на котором основывается соединение. Условие может указывать любой предикат, хотя чаще используются столбцы и операторы сравнения, например:SELECT p.ProductID, v.VendorID FROM Production.Product AS p JOIN Purchasing.ProductVendor AS v ON (p.ProductID = v.ProductID);
Когда условие указывает столбцы, их имена и типы данных могут не совпадать, однако, если типы данных не совпадают, столбцы должны быть либо совместимыми, либо иметь типы, которые SQL Server может неявно преобразовать. Если типы данных не могут быть преобразованы неявно, условие должно проводить явное преобразование типа данных при помощи функции CONVERT.
Могут существовать предикаты, использующие в предложении ON только одну из соединяемых таблиц. Такие предикаты также могут присутствовать в предложении WHERE запроса. Хотя размещение таких предикатов не оказывает влияния в случае внутренних соединений (INNER), при использовании внешних соединений (OUTER) они могут привести к другому результату. Это происходит потому, что предикаты в предложении ON применяются к таблице до соединения, в то время как предложение WHERE семантически применяется к результату соединения.
Дополнительные сведения об условиях поиска и предикатах см. в разделе Условие поиска (Transact-SQL).
CROSS JOIN
Указывает перекрестное произведение двух таблиц. Возвращает те же строки, что и соединение без предложения WHERE в старом режиме, не совместимом с SQL-92.left_table_source{ CROSS | OUTER } APPLY right_table_source
Указывает, что right_table_source оператора APPLY определяется для каждой строки left_table_source. Данная функциональность полезна в том случае, когда right_table_source содержит возвращающую табличное значение функцию, которая принимает значения столбцов left_table_source в качестве одного из своих аргументов.Вместе с APPLY должно быть указано либо CROSS, либо OUTER. Если указано CROSS, то при вычислении right_table_source для определенной строки left_table_source не создается ни одной строки и возвращается пустой результирующий набор.
При указании OUTER для каждой строки left_table_source создается одна строка, даже когда right_table_source вычисляется для этой строки и возвращается пустой результирующий набор.
Дополнительные сведения см. в разделах «Примечания» и Использование APPLY.
left_table_source
Источник таблицы, определенный в предыдущем аргументе. Дополнительные сведения см. в разделе «Примечания».right_table_source
Источник таблицы, определенный в предыдущем аргументе. Дополнительные сведения см. в разделе «Примечания».table_source PIVOT <pivot_clause>
Указывает, что сведение table_source основано на pivot_column. table_source является таблицей или табличным выражением. Результатом является таблица, содержащая все столбцы table_source, кроме pivot_column и value_column. Столбцы table_source, кроме pivot_column и value_column, называются столбцами группирования оператора PIVOT.Оператор PIVOT применяет операцию группирования к входной таблице по отношению к столбцам группирования и возвращает одну строку для каждой группы. Кроме того, вывод содержит один столбец для каждого значения, указанного в column_list, который отображается в pivot_column в input_table.
Дополнительные сведения см. в разделах «Примечания» и Использование операторов PIVOT и UNPIVOT.
Примечание Если PIVOT применяется к базам данных, обновленным до SQL Server, то уровень совместимости базы данных необходимо установить в значение 90 или выше. Дополнительные сведения об установке уровня совместимости базы данных см. в разделе Уровень совместимости инструкции ALTER DATABASE (Transact-SQL).
aggregate_function
Системная или определяемая пользователем статистическая функция, имеющая один или более входов. Статистическая функция должна быть инвариантной относительно значений NULL. Инвариантная относительно нулевых значений статистическая функция при определении статистического значения не учитывает нулевые значения в группе.Системная статистическая функция COUNT(*) недопустима.
value_column
Столбец значений оператора PIVOT. При использовании вместе с оператором UNPIVOT аргумент value_column не может быть именем существующего столбца во входном table_source.FOR pivot_column
Столбец сведения в операторе PIVOT. Аргумент pivot_column должен иметь тип, который может быть неявно или явно преобразован в nvarchar(). Этот столбец не может иметь тип image или rowversion.При использовании оператора UNPIVOT аргумент pivot_column является именем выходного столбца, полученного из table_source. В table_source не может быть существующего столбца с таким именем.
IN ( column_list )
В предложении PIVOT представлены все значения в аргументе pivot_column, которые станут именами столбцов выходной таблицы. В списке не могут быть указаны какие-либо имена столбцов, которые уже существуют во входном table_source, к которому применяется сведение.В предложении UNPIVOT представлены столбцы в table_source, которые будут сведены в один столбец pivot_column.
table_alias
Псевдоним для выходной таблицы. Должен быть указан аргумент pivot_table_alias.UNPIVOT <предложение_отмены_сведения>
Указывает, что входная таблица сведена из нескольких столбцов в column_list в один столбец под названием pivot_column.Дополнительные сведения см. в разделах «Примечания» и Использование операторов PIVOT и UNPIVOT.
Примечание Если UNPIVOT применяется к базам данных, обновленным до SQL Server, то уровень совместимости базы данных необходимо установить в значение 90 или выше. Сведения о задании уровня совместимости для базы данных см. в разделе Уровень совместимости инструкции ALTER DATABASE (Transact-SQL).
Замечания
Предложение FROM поддерживает синтаксис SQL-92-SQL для соединенных и производных таблиц. Синтаксис SQL-92 предусматривает операторы соединения INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER и CROSS.
UNION и JOIN в предложении FROM поддерживаются в представлениях и в производных таблицах и вложенных запросах.
Самосоединение — это таблица, соединенная сама с собой. Операции вставки или обновления, основанные на самосоединении, следуют порядку, указанному в предложении FROM.
Более ранние версии SQL Server поддерживают определение внешних соединений, которые используют операторы *= и =* в предложении WHERE. SQL Server версии 7.0 поддерживает стандарт ISO. Это предоставляет возможность использования операторов соединения в предложении FROM. Если для уровня совместимости базы данных установлено значение 90 или выше, операторы внешнего соединения (*= и =*) не поддерживаются.
Так как SQL Server учитывает статистику распределения и количества элементов со связанных серверов, предоставляющих статистику распределения столбцов, то подсказка соединения REMOTE не требуется для принудительной удаленной оценки соединения. Обработчик запросов SQL Server учитывает удаленную статистику и определяет, является ли стратегия удаленного соединения подходящей. Подсказка соединения REMOTE удобна для поставщиков, которые не предоставляют статистику распределения столбцов. Дополнительные сведения см. в разделе Требования к статистике распределения для поставщиков OLE DB.
Дополнительные сведения о работе с соединениями см. в разделах Основные принципы соединения и Использование соединений.
Использование оператора APPLY
Как левый, так и правый операнды оператора APPLY являются табличными выражениями. Главное различие между этими операндами состоит в том, что right_table_source может использовать возвращающую табличное значение функцию, которая принимает столбец из left_table_source в качестве одного из аргументов функции. left_table_source может включать возвращающие табличное значение функции, но не может содержать аргументы, которые являются столбцами из right_table_source.
Для предоставления источника таблицы для предложения FROM оператор APPLY выполняет следующие действия.
Оценивает right_table_source для каждой строки left_table_source, чтобы создать наборы строк.
Значения в right_table_source зависят от left_table_source. right_table_source может быть представлен примерно следующим образом: TVF(left_table_source.row), где TVF является возвращающей табличное значение функцией.
Объединяет результирующие наборы, предоставляемые для каждой строки при оценке right_table_source, с left_table_source посредством выполнения операции UNION ALL.
Список столбцов, полученный в результате выполнения оператора APPLY, представляет собой набор столбцов из left_table_source, объединенный со списком столбцов из right_table_source.
Использование операторов PIVOT и UNPIVOT
Аргументы pivot_column и value_column являются столбцами группирования, используемыми оператором PIVOT. Для получения выходного результирующего набора оператор PIVOT выполняет следующие действия.
Применяет GROUP BY к input_table к столбцам группирования и предоставляет одну выходную строку для каждой группы.
Столбцы группирования в выходной строке получают соответствующие значения столбцов этой группы в input_table.
Формирует значения столбцов в списке столбцов для каждой выходной строки, для чего выполняет следующие действия.
Дополнительно группирует строки, созданные в GROUP BY для аргумента pivot_column в предыдущем шаге.
Для каждого выходного столбца в column_list выбирает подгруппу, которая удовлетворяет следующим условиям:
pivot_column = CONVERT(<data type of pivot_column>, 'output_column')
aggregate_function вычисляется по отношению к value_column в этой подгруппе, и этот результат возвращается как значение соответствующего output_column. Если подгруппа пуста, SQL Server определяет для такого output_column значение NULL. Если используется статистическая функция COUNT, а подгруппа пуста, то возвращается значение (0).
Дополнительные сведения см. в разделе Использование операторов PIVOT и UNPIVOT.
Разрешения
Требует разрешения для инструкции DELETE, SELECT или UPDATE.
Примеры
А. Использование простого предложения FROM
В следующем примере извлекаются столбцы TerritoryID и Name из таблицы SalesTerritory в образце базы данных AdventureWorks.
USE AdventureWorks ;
GO
SELECT TerritoryID, Name
FROM Sales.SalesTerritory
ORDER BY TerritoryID ;
Ниже приводится результирующий набор.
TerritoryID Name
----------- ------------------------------
1 Northwest
2 Northeast
3 Central
4 Southwest
5 Southeast
6 Canada
7 France
8 Germany
9 Australia
10 United Kingdom
(10 row(s) affected)
Б. Использование подсказок оптимизатора TABLOCK и HOLDLOCK
Следующая частичная транзакция показывает, как явно указать совмещаемую блокировку на таблицу Employee и как прочитать индекс. Блокировка удерживается на протяжении всей транзакции.
USE AdventureWorks ;
GO
BEGIN TRAN
SELECT COUNT(*)
FROM HumanResources.Employee WITH (TABLOCK, HOLDLOCK) ;
В. Использование синтаксиса SQL-92 для CROSS JOIN
В следующем примере возвращается векторное произведение двух таблиц Employee и Department. Возвращается список всех возможных сочетаний строк EmployeeID и все строки имен Department .
USE AdventureWorks ;
GO
SELECT e.EmployeeID, d.Name AS Department
FROM HumanResources.Employee AS e
CROSS JOIN HumanResources.Department AS d
ORDER BY e.EmployeeID, d.Name ;
Г. Использование синтаксиса SQL-92 для FULL OUTER JOIN
В следующем примере возвращается имя продукта и любые соответствующие заказы на продажу в таблице SalesOrderDetail. В примере также возвращаются все заказы на продажу, продукты для которых не представлены в таблице Product, и все продукты с заказом на продажу, отличные от тех, которые представлены в таблице Product.
USE AdventureWorks ;
GO
-- The OUTER keyword following the FULL keyword is optional.
SELECT p.Name, sod.SalesOrderID
FROM Production.Product AS p
FULL OUTER JOIN Sales.SalesOrderDetail AS sod
ON p.ProductID = sod.ProductID
WHERE p.ProductID IS NULL OR sod.ProductID IS NULL
ORDER BY p.Name ;
Д. Использование синтаксиса SQL-92 для LEFT OUTER JOIN
Следующий пример соединяет две таблицы по столбцу ProductID и сохраняет несовпадающие строки из левой таблицы. Таблица Product сопоставляется с таблицей SalesOrderDetail по столбцам ProductID в каждой таблице. В результирующем наборе отражаются все продукты (как входящие в заказы, так и не входящие).
USE AdventureWorks ;
GO
SELECT p.Name, sod.SalesOrderID
FROM Production.Product AS p
LEFT OUTER JOIN Sales.SalesOrderDetail AS sod
ON p.ProductID = sod.ProductID
ORDER BY p.Name ;
Е. Использование синтаксиса SQL-92 для INNER JOIN
Следующий пример возвращает все названия продуктов и идентификаторы заказов.
USE AdventureWorks ;
GO
-- By default, SQL Server performs an INNER JOIN if only the JOIN
-- keyword is specified.
SELECT p.Name, sod.SalesOrderID
FROM Production.Product AS p
INNER JOIN Sales.SalesOrderDetail AS sod
ON p.ProductID = sod.ProductID
ORDER BY p.Name ;
Ж. Использование синтаксиса SQL-92 для RIGHT OUTER JOIN
Следующий пример соединяет две таблицы по столбцу TerritoryID и сохраняет несовпадающие строки из правой таблицы. Таблица SalesTerritory сопоставляется с таблицей SalesPerson по столбцу TerritoryID каждой таблицы. В результирующем наборе отображаются все менеджеры по продажам независимо от того, назначена им или нет обслуживаемая территория.
USE AdventureWorks ;
GO
SELECT st.Name AS Territory, sp.SalesPersonID
FROM Sales.SalesTerritory AS st
RIGHT OUTER JOIN Sales.SalesPerson AS sp
ON st.TerritoryID = sp.TerritoryID ;
З. Использование подсказок в соединениях HASH и MERGE
Следующий пример выполняет соединение трех таблиц — Product, ProductVendor и Vendor — для получения списка продуктов и их поставщиков. Оптимизатор запросов соединяет таблицы Product и ProductVendor (p и pv) с помощью соединения слиянием (MERGE). Затем результаты соединения слиянием таблиц Product и ProductVendor (p и pv) соединяются при помощи HASH в таблицу Vendor для получения (p и pv) и v.
Важно! |
---|
После того как указана подсказка в соединении, ключевое слово INNER более не является необязательным и должно быть задано в явном виде для выполнения INNER JOIN. |
USE AdventureWorks ;
GO
SELECT p.Name AS ProductName, v.Name AS VendorName
FROM Production.Product AS p
INNER MERGE JOIN Purchasing.ProductVendor AS pv
ON p.ProductID = pv.ProductID
INNER HASH JOIN Purchasing.Vendor AS v
ON pv.VendorID = v.VendorID
ORDER BY p.Name, v.Name ;
И. Использование производной таблицы
Следующий пример использует производную таблицу, инструкцию SELECT после предложения FROM, для возврата имен и фамилий сотрудников и городов, в которых они проживают.
USE AdventureWorks ;
GO
SELECT RTRIM(c.FirstName) + ' ' + LTRIM(c.LastName) AS Name,
d.City
FROM Person.Contact AS c
INNER JOIN HumanResources.Employee e ON c.ContactID = e.ContactID
INNER JOIN
(SELECT ea.AddressID, ea.EmployeeID, a.City
FROM Person.Address AS a
INNER JOIN HumanResources.EmployeeAddress AS ea
ON a.AddressID = ea.AddressID) AS d
ON e.EmployeeID = d.EmployeeID
ORDER BY c.LastName, c.FirstName;
К. Использование TABLESAMPLE для чтения данных из выборки строк в таблице
Следующий пример использует TABLESAMPLE в предложении FROM для возврата примерно 10 процентов всех строк в таблице Customer базы данных AdventureWorks.
USE AdventureWorks ;
GO
SELECT *
FROM Sales.Customer TABLESAMPLE SYSTEM (10 PERCENT) ;
Л. Использование APPLY
Следующий пример исходит из того, что в базе данных существуют следующие таблицы с данной схемой:
Departments: DeptID, DivisionID, DeptName, DeptMgrID
EmpMgr: MgrID, EmpID
Employees: EmpID, EmpLastName, EmpFirstName, EmpSalary
Также есть возвращающая табличное значение функция GetReports(MgrID), возвращающая список всех сотрудников (EmpID, EmpLastName, EmpSalary), которые находятся в прямом или косвенном подчинении указанного менеджера MgrID.
В этом примере используется APPLY для возврата всех отделов и всех сотрудников этих отделов. Если в каком-либо отделе нет сотрудников, для этого отдела не будет возвращено никаких строк.
SELECT DeptID, DeptName, DeptMgrID, EmpID, EmpLastName, EmpSalary
FROM Departments d CROSS APPLY dbo.GetReports(d.DeptMgrID) ;
Если необходимо, чтобы запрос предоставил строки для тех отделов без сотрудников, в которых будут выданы значения NULL для столбцов EmpID, EmpLastName и EmpSalary, нужно вместо APPLY применить OUTER APPLY.
SELECT DeptID, DeptName, DeptMgrID, EmpID, EmpLastName, EmpSalary
FROM Departments d OUTER APPLY dbo.GetReports(d.DeptMgrID) ;
М. Использование операторов PIVOT и UNPIVOT
Следующий пример возвращает количество заказов на покупку, размещенных сотрудниками с идентификаторами 164, 198, 223, 231 и 233, сгруппированных по идентификаторам производителей.
USE AdventureWorks;
GO
SELECT VendorID, [164] AS Emp1, [198] AS Emp2, [223] AS Emp3, [231] AS Emp4, [233] AS Emp5
FROM
(SELECT PurchaseOrderID, EmployeeID, VendorID
FROM Purchasing.PurchaseOrderHeader) AS p
PIVOT
(
COUNT (PurchaseOrderID)
FOR EmployeeID IN
( [164], [198], [223], [231], [233] )
) AS pvt
ORDER BY VendorID;
Вот частичный результирующий набор:
VendorID Emp1 Emp2 Emp3 Emp4 Emp5
----------------------------------------------------------------
1 4 3 5 4 4
2 4 1 5 5 5
3 4 3 5 4 4
4 4 2 5 5 4
5 5 1 5 5 5
Чтобы применить к таблице отмену сведения, следует учесть, что результирующий набор, предоставленный в предыдущем примере, хранится как pvt. Запрос выглядит следующим образом:
--Create the table and insert values as portrayed in the previous example.
CREATE TABLE dbo.pvt (VendorID int, Emp1 int, Emp2 int,
Emp3 int, Emp4 int, Emp5 int);
GO
-- Insert 5 rows into the table.
INSERT INTO dbo.pvt VALUES (1,4,3,5,4,4),(2,4,1,5,5,5),(3,4,3,5,4,4),
(4,4,2,5,5,4),(5,5,1,5,5,5);
GO
--Unpivot the table.
SELECT VendorID, Employee, Orders
FROM
(SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
FROM dbo.pvt) AS p
UNPIVOT
(Orders FOR Employee IN
(Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt;
GO
Вот частичный результирующий набор:
VendorID Employee Orders
------------------------------
1 Emp1 4
1 Emp2 3
1 Emp3 5
1 Emp4 4
1 Emp5 4
2 Emp1 4
2 Emp2 1
2 Emp3 5
2 Emp4 5
2 Emp5 5