Skip to main content
Предложение FROM (Transact-SQL)
 

ПРИМЕНЯЕТСЯ К: даSQL Server (начиная с 2008) даБаза данных SQL Azure даХранилище данных SQL Azure даParallel Data Warehouse

Указывает таблицы, представления, производные таблицы и соединенные таблицы, которые используются в инструкциях DELETE, SELECT и UPDATE в SQL Server 2016. В инструкции SELECT требуется предложение FROM, за исключением тех случаев, когда список выбора содержит только константы, переменные и арифметические выражения (без имен столбцов).

Topic link icon  Синтаксические обозначения в Transact-SQL

-- Syntax for SQL Server and Azure SQL Database  
  
[ 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 ] ) ]  
    | FOR SYSTEM_TIME <system_time>   
}  
<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 ]   
  
<system_time> ::=  
{  
       AS OF <date_time>  
    |  FROM <start_date_time> TO <end_date_time>  
    |  BETWEEN <start_date_time> AND <end_date_time>  
    |  CONTAINED IN (<start_date_time> , <end_date_time>)   
    |  ALL  
}  
  
    <date_time>::=  
        <date_time_literal> | @date_time_variable  
  
    <start_date_time>::=  
        <date_time_literal> | @date_time_variable  
  
    <end_date_time>::=  
        <date_time_literal> | @date_time_variable  
  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
  
FROM { <table_source> [ ,...n ] }  
  
<table_source> ::=   
{  
    [ database_name . [ schema_name ] . | schema_name . ] table_or_view_name [ AS ] table_or_view_alias  
    | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]  
    | <joined_table>  
}  
  
<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 ] [ <join hint> ] JOIN  
    | LEFT  [ OUTER ] JOIN  
    | RIGHT [ OUTER ] JOIN  
    | FULL  [ OUTER ] JOIN  
  
<join_hint> ::=   
    REDUCE  
    | REPLICATE  
    | REDISTRIBUTE  
  

<table_source>
Указывает таблицу, представление, табличную переменную или источник производной таблицы с указанием или без указания псевдонима для использования в инструкции Transact-SQL. В инструкции можно использовать до 256 источников таблиц, хотя предел изменяется в зависимости от доступной памяти и сложности других выражений в запросе. Отдельные запросы могут не поддерживать 256 источников таблиц.

System_CAPS_ICON_note.jpg Примечание


Производительность выполнения запросов может снизиться из-за большого количества таблиц, указанных в запросе. На время компиляции и оптимизации также влияют дополнительные факторы. Они включают в себя наличие индексов и индексированных представлений в каждом <table_source> и размер <select_list> в инструкции SELECT.

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

представления table_or_view_name
Имя таблицы или представления.

Если таблица или представление существует в другой базе данных на том же экземпляре SQL Server, используйте полное доменное имя в форме базы данных.* schema. object_name*.

Если таблица или представление существует вне экземпляра SQL Serverl, используйте четырехчастное имя в форме связанный_сервер.* catalog. schema. Объект*. Дополнительные сведения см. в статье sp_addlinkedserver (Transact-SQL). Четырехсоставного имени, которое создается с использованием OPENDATASOURCE работать так, как серверная часть имени может также использоваться для указания удаленного источника таблицы. Если указана функция OPENDATASOURCE, имябазыданных и schema_name могут применяться не ко всем источникам данных, зависит от возможностей поставщика OLE DB, который обращается к удаленному объекту.

[КАК] table_alias
Является псевдонимом для table_source , может применяться для удобства, а также для различения таблицы или представления в самосоединении или вложенном запросе. Псевдоним часто является сокращенным именем таблицы, использующимся для соотнесения с определенными столбцами таблиц в соединении. Если имя столбца существует более чем в одной таблице соединения, SQL Server потребует, чтобы имя столбца было уточнено именем таблицы, представления или псевдонима. Если определен псевдоним, нельзя использовать имя таблицы.

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

WITH (<table_hint>)
Указывает на то, что с данной таблицей и для данной инструкции оптимизатор запросов использует стратегию оптимизации или блокировки. Дополнительные сведения см. в разделе Табличные указания (Transact-SQL).

rowset_function

Применяется к: SQL Server 2008 через SQL Server 2016 и База данных SQL.

Указывает одну из функций набора строк, например OPENROWSET, возвращающую объект, который можно использовать вместо ссылки на таблицу. Дополнительные сведения о списке функций набора строк см. в разделе функции наборов строк (Transact-SQL).

Использование функций OPENROWSET и OPENQUERY для задания удаленного объекта зависит от возможностей поставщика OLE DB, который обращается к удаленному объекту.

bulk_column_alias

Применяется к: SQL Server 2008 через SQL Server 2016 и База данных SQL.

Дополнительный псевдоним для замены имени столбца в результирующем наборе. Псевдонимы столбца разрешены только в инструкциях SELECT, использующих функцию OPENROWSET с параметром BULK. При использовании bulk_column_alias, укажите псевдоним для каждого столбца таблицы в том же порядке, что и столбцы в файле.

System_CAPS_ICON_note.jpg Примечание


Данный псевдоним, если он присутствует, переопределяет атрибут NAME в элементах COLUMN файла XML.

user_defined_function
Указывает функцию с табличным значением.

OPENXML <openxml_clause>

Применяется к: SQL Server 2008 через SQL Server 2016 и База данных SQL.

Обеспечивает представление XML-документа в виде набора строк. Дополнительные сведения см. в разделе OPENXML (Transact-SQL).

derived_table
Это вложенный запрос, который извлекает строки из базы данных. derived_table используется в качестве входных данных для внешнего запроса.

Производный _table можно использовать Transact-SQL конструктором табличных значений для указания нескольких строк. Например, SELECT * FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);. Дополнительные сведения см. в разделе конструктор табличных значений (Transact-SQL).

column_alias
Дополнительный псевдоним для замены имени столбца в результирующем наборе производной таблицы. Для каждого столбца в списке выбора следует включить по одному псевдониму столбца и заключить весь список псевдонимов столбцов в скобки.

представления table_or_view_name FOR SYSTEM_TIME<system_time></system_time>

Применяется к: SQL Server 2016 через SQL Server 2016 и База данных SQL.

Указывает, что возвращаются конкретную версию данных из указанной временной таблице и его связанного журнала с версией системы

<tablesample_clause>
Указывает, что из таблицы возвращается выборка данных. Выборка может быть приблизительной. Это предложение может быть использовано в инструкциях SELECT, UPDATE или DELETE в отношении любой первичной или соединяемой таблицы. TABLESAMPLE не может быть указано для представлений.

System_CAPS_ICON_note.jpg Примечание


При использовании предложения TABLESAMPLE к базам данных, которые были обновлены до SQL Server, с уровнем совместимости базы данных 110 или больше, оператор PIVOT нельзя использовать в запросах рекурсивного обобщенного табличного выражения (CTE). Дополнительные сведения см. в разделе Уровень совместимости инструкции ALTER DATABASE (Transact-SQL).

SYSTEM
Зависящий от реализации метод выборки, определенный стандартами ISO. В SQL Server это единственно доступный метод выборки, и он применяется по умолчанию. SYSTEM использует основанный на страницах метод выборки со случайным набором страниц, все строки которых возвращаются как подмножество выборки.

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_seed значение SQL Server будет скорее всего, вернет другую выборку строк в таблице. Изменениями считаются следующие действия над таблицей: вставка, обновление, удаление, перестроение или дефрагментация индекса, а также восстановление или присоединение базы данных.

repeat_seed
Константное целочисленное выражение, используемое SQL Server для формирования случайного числа. repeat_seedbigint. Если repeat_seed не указан, SQL Server присваивает значение случайным образом. Для конкретного repeat_seed значение, результат выборки всегда равно Если изменения не были применены к таблице. Repeat_seed выражения должно быть целым числом больше нуля.

<joined_table>
Результирующий набор, полученный из двух или более таблиц. Для нескольких соединений следует использовать скобки, чтобы изменить естественный порядок соединений.

<join_type>
Указание типа операции соединения.

ВНУТРЕННЕЕ
Указывает, что возвращаются все совпадающие пары строк. Отмена несовпадающих строк из обеих таблиц. Если тип соединения не указан, этот тип задается по умолчанию.

FULL [ OUTER ]
Указывает, что в результирующий набор включаются строки как из левой, так и из правой таблицы, несоответствующие условиям соединения, а выходные столбцы, соответствующие оставшейся таблице, устанавливаются в значение NULL. Этим дополняются все строки, обычно возвращаемые при помощи INNER JOIN.

LEFT [ OUTER ]
Указывает, что все строки из левой таблицы, не соответствующие условиям соединения, включаются в результирующий набор, а выходные столбцы из оставшейся таблицы устанавливаются в значение NULL в дополнение ко всем строкам, возвращаемым внутренним соединением.

RIGHT [ OUTER ]
Указывает, что все строки из правой таблицы, не соответствующие условиям соединения, включаются в результирующий набор, а выходные столбцы, соответствующие оставшейся таблице, устанавливаются в значение NULL в дополнение ко всем строкам, возвращаемым внутренним соединением.

<join_hint>
Для SQL Server и База данных SQL, указывает, что SQL Server запроса, оптимизатор использовать Указание одного соединения, или алгоритм выполнения каждого соединения, указанного в предложении FROM запроса. Дополнительные сведения см. в разделе указания присоединения (Transact-SQL).

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

УМЕНЬШИТЬ
Уменьшает количество строк, перемещать таблицы правой стороны соединения для обеспечения совместимости двух таблиц несовместимые распространения. Указание полусоединение также называется указанием REDUCE.

REPLICATE
Приводит значений соединяемый столбец в таблице на левой стороне соединения реплицировать на все узлы. Таблица справа соединяется с реплицированной версии этих столбцов.

ПОВТОРНОЕ РАСПРОСТРАНЕНИЕ
Принудительно двух источников данных для распространения на столбцы, указанные в предложении JOIN. Для распределенных таблицы Параллельное хранилище данных выполнит перемещения в случайном порядке. Для реплицируемой таблицы Параллельное хранилище данных выполнит trim перемещения. Чтобы понять их перемещения типов, см. в разделе «DMS планирование операций запроса» в разделе «Основные сведения о планов запросов» в Parallel Data Warehouse product documentation. Это указание может повысить производительность, когда план запроса использует широковещательный перемещения для разрешения объединения несовместимых распространения.

JOIN
Указывает, что данная операция соединения должна произойти между указанными источниками или представлениями таблицы.

ON <search_condition>
Задает условие, на котором основывается соединение. Условие может указывать любой предикат, хотя чаще используются столбцы и операторы сравнения, например:

SELECT p.ProductID, v.BusinessEntityID  
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} right_table_source
Указывает, что right_table_source из условий оператор выполняется для каждой строки 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 вычисляется для этой строки и возвращает пустой результирующий набор.

Дополнительные сведения см. в разделе «Примечания».

left_table_source
Источник таблицы, определенный в предыдущем аргументе. Дополнительные сведения см. в разделе «Примечания».

right_table_source
Источник таблицы, определенный в предыдущем аргументе. Дополнительные сведения см. в разделе «Примечания».

table_source PIVOT<pivot_clause></pivot_clause>
Указывает, что источник_таблицы основано на pivot_column. table_source является таблицей или табличным выражением. Выходные данные — это таблица, содержит все столбцы источник_таблицы за исключением pivot_column и value_column. Столбцы источник_таблицы, за исключением pivot_column и value_column, называются столбцами группирования оператора pivot. Дополнительные сведения о PIVOT и UNPIVOT см. в разделе с помощью PIVOT и UNPIVOT.

Оператор PIVOT применяет операцию группирования к входной таблице по отношению к столбцам группирования и возвращает одну строку для каждой группы. Кроме того, выходные данные содержат один столбец для каждого значения, указанного в column_list , отображается в pivot_column из input_table.

Дополнительные сведения см. в разделе «Замечания» далее.

aggregate_function
Системная или определяемая пользователем агрегатная функция, имеющая один или более входов. Агрегатная функция должна быть инвариантной относительно значений NULL. Инвариантная относительно нулевых значений агрегатная функция при определении статистического значения не учитывает нулевые значения в группе.

Системная агрегатная функция COUNT(*) недопустима.

value_column
Столбец значений оператора PIVOT. При использовании UNPIVOT, value_column не может быть именем существующего столбца во входном table_source.

ДЛЯ pivot_column
Столбец сведения оператора PIVOT. pivot_column должен иметь тип, неявно или явно преобразован в nvarchar(). Этот столбец не может быть изображение или rowversion.

При применении UNPIVOT pivot_column имя выходного столбца, полученного из table_source. Не может быть существующего столбца в table_source с таким именем.

IN (column_list )
В предложении PIVOT представлены все значения в pivot_column , которые станут именами столбцов выходной таблицы. В списке не указаны имена столбцов, которые уже существуют во входных данных table_source , к которому применяется сведение.

В предложении UNPIVOT представлены столбцы в источник_таблицы , будут сведены в один pivot_column.

table_alias
Псевдоним выходной таблицы. pivot_table_alias должен быть указан.

UNPIVOT <unpivot_clause>
Указывает, что входная таблица сведена из нескольких столбцов в column_list в один столбец называется pivot_column. Дополнительные сведения о PIVOT и UNPIVOT см. в разделе с помощью PIVOT и UNPIVOT.

AS OF <date_time>

Применяется к: SQL Server 2016 через SQL Server 2016 и База данных SQL.

Возвращает таблицу с одной записью для каждой строки, содержащей значения, которые были фактическими (текущими) в указанный момент времени в прошлом. На внутреннем уровне объединение выполняется между темпоральной таблицей и соответствующей таблицей журнала, и результаты отфильтровываются так, чтобы возвращались значения в строке, которая была действительной на момент времени, определяемый параметром <дата_время>. Значение для строки считается действительным, если значение system_start_time_column_name меньше или равно значению параметра <дата_время>, а значение system_end_time_column_name больше значения параметра <дата_время>.

FROM <start_date_time> TO <end_date_time>

Применяется к: SQL Server 2016 через SQL Server 2016 и База данных SQL.

Возвращает таблицу, содержащую значения для всех версий запись, которая была активна в течение указанного интервала времени, независимо от ли они запущены активности до * <start_date_time> * параметр значение для аргумента FROM или прекращает свое существование, активным после * <end_date_time> * значение параметра для аргумента в.</end_date_time></start_date_time> На внутреннем уровне объединение выполняется между темпоральной таблицей и соответствующей таблицей журнала и результаты отфильтровываются так, чтобы возвращать значения для всех версий строк, которые были активными в течение указанного временного диапазона. Включаются строки, стала активной точно на нижнюю границу, определенные в конечной точке FROM и не включаются строки, стала активной, совпадают с верхней границей, определяемые для конечной точки.

BETWEEN <start_date_time> AND <end_date_time>

Применяется к: SQL Server 2016 через SQL Server 2016 и База данных SQL.

Аналогично указанному выше в **из <start_date_time>TO <end_date_time> ** описание, за исключением того, он включает строки, которые стали активными в верхнюю границу, определяется <end_date_time>конечной точки.</end_date_time> </end_date_time> </start_date_time>

CONTAINED IN (<start_date_time>, <end_date_time>)

Применяется к: SQL Server 2016 через SQL Server 2016 и База данных SQL.

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

ALL
Возвращает таблицу, содержащую значения из всех строк из текущей таблицы и таблицы журнала.

Предложение FROM поддерживает синтаксис SQL-92-SQL для соединенных и производных таблиц. Синтаксис SQL-92 предусматривает операторы соединения INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER и CROSS.

UNION и JOIN в предложении FROM поддерживаются в представлениях и в производных таблицах и вложенных запросах.

Самосоединение — это таблица, соединенная сама с собой. Операции вставки или обновления, основанные на самосоединении, следуют порядку, указанному в предложении FROM.

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

Как левый, так и правый операнды оператора APPLY являются табличными выражениями. Основное различие между этими операндами это right_table_source можно использовать табличную функцию, которая принимает столбец из left_table_source как один из аргументов функции. Left_table_source могут включать функции, возвращающие табличные значения, но не может содержать аргументы, которые являются столбцами из right_table_source.

Для предоставления табличного источника для предложения FROM оператор APPLY выполняет следующее:

  1. Вычисляет right_table_source для каждой строки left_table_source для создания набора строк.

    Значения в right_table_source зависят от left_table_source. right_table_source может быть представлен примерно следующим образом: TVF(left_table_source.row), где TVF является табличной функции.

  2. Объединяет результирующие наборы, которые создаются для каждой строки при вычислении right_table_source с left_table_source с помощью операции UNION ALL.

    Список столбцов, полученный в результате выполнения оператора APPLY представляет собой набор столбцов из left_table_source , объединенный со списком столбцов из right_table_source.

Pivot_column и value_column являются столбцами группирования, используемых в операторе PIVOT. Для получения выходного результирующего набора оператор PIVOT выполняет следующее:

  1. Применяет GROUP BY на его input_table для группирования столбцы и формирует одну выходную строку для каждой группы.

    Столбцы группирования в выходной строке получить соответствующие значения столбцов этой группы в input_table.

  2. Формирует значения столбцов в списке столбцов для каждой выходной строки, для чего выполняет следующее:

    1. Дополнительно группирует строки, созданные в GROUP BY на предыдущем шаге, к pivot_column.

      Для каждого выходного столбца в column_list, выбирает подгруппу, которая удовлетворяет условию:

      pivot_column = CONVERT(<data type of pivot_column>, 'output_column')

    2. aggregate_function оценивается value_column об этом подгруппе и его результат возвращается как значение соответствующего output_column. Если подгруппа пуста, SQL Server создает значение null для этого output_column. Если используется агрегатная функция COUNT, а подгруппа пуста, то возвращается значение (0).

Дополнительные сведения о PIVOT и UNPIVOT, включая примеры см. в разделе с помощью PIVOT и UNPIVOT.

Требует разрешения для инструкции DELETE, SELECT или UPDATE.

A. Использование простого предложения FROM

В следующем примере извлекаются столбцы TerritoryID и Name из таблицы SalesTerritory в образце базы данных AdventureWorks2012.

  
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 и как прочитать индекс. Блокировка удерживается на протяжении всей транзакции.

  
BEGIN TRAN  
SELECT COUNT(*)   
FROM HumanResources.Employee WITH (TABLOCK, HOLDLOCK) ;  

В. Использование синтаксиса SQL-92 для CROSS JOIN

В следующем примере возвращается векторное произведение двух таблиц Employee и Department в базе данных AdventureWorks2012. Список всех возможных комбинаций BusinessEntityID строк и все Department имя строки возвращаются.

  
SELECT e.BusinessEntityID, d.Name AS Department  
FROM HumanResources.Employee AS e  
CROSS JOIN HumanResources.Department AS d  
ORDER BY e.BusinessEntityID, d.Name ;  

Г. Использование синтаксиса SQL-92 для FULL OUTER JOIN

В следующем примере возвращается название продукта и любые соответствующие заказы на продажу в таблице SalesOrderDetail в базе данных AdventureWorks2012. В примере также возвращаются все заказы на продажу, продукты для которых не представлены в таблице Product, и все продукты с заказом на продажу, отличные от тех, которые представлены в таблице Product.

-- 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  
ORDER BY p.Name ;  

Д. Использование синтаксиса SQL-92 для LEFT OUTER JOIN

Следующий пример соединяет две таблицы по столбцу ProductID и сохраняет несовпадающие строки из левой таблицы. Таблица Product сопоставляется с таблицей SalesOrderDetail по столбцам ProductID в каждой таблице. В результирующем наборе отражаются все продукты (как входящие в заказы, так и не входящие).

  
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

Следующий пример возвращает все названия продуктов и идентификаторы заказов.

  
-- 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 каждой таблицы. В результирующем наборе отображаются все представители отдела продаж независимо от того, назначена им обслуживаемая территория или нет.

  
SELECT st.Name AS Territory, sp.BusinessEntityID  
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.

System_CAPS_ICON_important.jpg Важно


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

  
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.BusinessEntityID = v.BusinessEntityID  
ORDER BY p.Name, v.Name ;  

И. Использование производной таблицы

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

  
SELECT RTRIM(p.FirstName) + ' ' + LTRIM(p.LastName) AS Name, d.City  
FROM Person.Person AS p  
INNER JOIN HumanResources.Employee e ON p.BusinessEntityID = e.BusinessEntityID   
INNER JOIN  
   (SELECT bea.BusinessEntityID, a.City   
    FROM Person.Address AS a  
    INNER JOIN Person.BusinessEntityAddress AS bea  
    ON a.AddressID = bea.AddressID) AS d  
ON p.BusinessEntityID = d.BusinessEntityID  
ORDER BY p.LastName, p.FirstName;  

К. Использование TABLESAMPLE для чтения данных из выборки строк в таблице

В следующем примере используется TABLESAMPLE в предложении FROM для возврата около 10 процентов всех строк из таблицы Customer.

  
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) ;  

М. Использование CROSS APPLY

В следующем примере показано получение моментального снимка всех планов запросов, находящихся в кэше планов, путем получения дескрипторов планов для всех планов запросов в кэше запросом динамического административного представления sys.dm_exec_cached_plans. Затем оператор CROSS APPLY передает дескрипторы планов в sys.dm_exec_query_plan. Вывод инструкции Showplan в формате XML для каждого плана, находящегося в кэше планов, находится в столбце query_plan возвращаемой таблицы.

USE master;  
GO  
SELECT dbid, object_id, query_plan   
FROM sys.dm_exec_cached_plans AS cp   
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle);   
GO  

Н. С помощью FOR SYSTEM_TIME

Применяется к: SQL Server 2016 через SQL Server 2016 и База данных SQL.

В следующем примере аргумент date_time_literal_or_variable для SYSTEM_TIME AS OF возвращает строки таблицы, которые были фактическое (текущая) 1 января 2014 г.

SELECT DepartmentNumber,   
    DepartmentName,   
    ManagerID,   
    ParentDepartmentNumber   
FROM DEPARTMENT  
FOR SYSTEM_TIME AS OF '2014-01-01'  
WHERE ManagerID = 5  

В следующем примере SYSTEM_TIME из date_time_literal_or_variable TO date_time_literal_or_variable аргумент для возвращения всех строк, которые были активны во время периода, определенного как начиная с 1 января 2013 г. и заканчивая 1 января 2014 г., за исключением верхней границы.

SELECT DepartmentNumber,   
    DepartmentName,   
    ManagerID,   
    ParentDepartmentNumber   
FROM DEPARTMENT  
FOR SYSTEM_TIME FROM '2013-01-01' TO '2014-01-01'  
WHERE ManagerID = 5  

В следующем примере используется date_time_literal_or_variable SYSTEM_TIME МЕЖДУ и date_time_literal_or_variable аргумент для возвращения всех строк, которые были активны во время периода, определенного как начиная с 1 января 2013 г. и заканчивая 1 января 2014 г., включая верхнюю границу.

SELECT DepartmentNumber,   
    DepartmentName,   
    ManagerID,   
    ParentDepartmentNumber   
FROM DEPARTMENT  
FOR SYSTEM_TIME BETWEEN '2013-01-01' AND '2014-01-01'  
WHERE ManagerID = 5  

В следующем примере используется оператор FOR SYSTEM_TIME СОДЕРЖИТСЯ в (date_time_literal_or_variable, date_time_literal_or_variable) аргумент для возврата всех строк, которые были открыты и закрыт во время периода, определенного как начиная с 1 января 2013 г. и заканчивая 1 января 2014 г.

SELECT DepartmentNumber,   
    DepartmentName,   
    ManagerID,   
    ParentDepartmentNumber   
FROM DEPARTMENT  
FOR SYSTEM_TIME CONTAINED IN ( '2013-01-01', '2014-01-01' )  
WHERE ManagerID = 5  

В следующем примере переменной, а не литерал для предоставления граничных значений даты для запроса.

DECLARE @AsOfFrom datetime2 = dateadd(month,-12, sysutcdatetime())  
DECLARE @AsOfTo datetime2 = dateadd(month,-6, sysutcdatetime())  
  
SELECT DepartmentNumber,   
    DepartmentName,   
    ManagerID,   
    ParentDepartmentNumber   
FROM DEPARTMENT  
FOR SYSTEM_TIME FROM @AsOfFrom TO @AsOfTo  
WHERE ManagerID = 5  
  

О. Использование простого предложения FROM

В следующем примере извлекается SalesTerritoryID и SalesTerritoryRegion столбцы из DimSalesTerritory таблицы.

-- Uses AdventureWorks  
  
SELECT SalesTerritoryKey, SalesTerritoryRegion  
FROM DimSalesTerritory  
ORDER BY SalesTerritoryKey;  

П. Использование синтаксиса INNER JOIN

В следующем примере возвращается SalesOrderNumber, ProductKey, и EnglishProductName столбцы из FactInternetSales и DimProduct таблицы, где ключ соединения ProductKey, соответствует в обеих таблицах. SalesOrderNumber И EnglishProductName столбцы каждого существует в одной из таблиц, поэтому нет необходимости указывать псевдоним таблицы с этими столбцами, как показано; эти псевдонимы включены для удобства чтения. Слово AS перед псевдонима имя не является обязательным, но рекомендуется для упрощения чтения и для соответствия стандарту ANSI.

-- Uses AdventureWorks  
  
SELECT fis.SalesOrderNumber, dp.ProductKey, dp.EnglishProductName  
FROM FactInternetSales AS fis INNER JOIN DimProduct AS dp  
ON dp.ProductKey = fis.ProductKey;  

Поскольку INNER ключевое слово не требуется для внутренних соединений, этот же запрос можно записать так:

-- Uses AdventureWorks  
  
SELECT fis.SalesOrderNumber, dp.ProductKey, dp.EnglishProductName  
FROM FactInternetSales fis JOIN DimProduct dp  
ON dp.ProductKey = fis.ProductKey;  

A WHERE предложение может также использоваться с этим запросом для ограничения результатов. В этом примере результаты ограничиваются SalesOrderNumber значения больше, чем «SO5000»:

-- Uses AdventureWorks  
  
SELECT fis.SalesOrderNumber, dp.ProductKey, dp.EnglishProductName  
FROM FactInternetSales AS fis JOIN DimProduct AS dp  
ON dp.ProductKey = fis.ProductKey  
WHERE fis.SalesOrderNumber > 'SO50000'  
ORDER BY fis.SalesOrderNumber;  

Т. Используя синтаксис LEFT OUTER JOIN и RIGHT OUTER JOIN

Следующий пример соединяет FactInternetSales и DimProduct таблиц на ProductKey столбцов. Синтаксис левое внешнее соединение сохраняет несовпадающие строки из левой (FactInternetSales) таблицы. Поскольку FactInternetSales таблица не содержит ProductKey значения, которые не соответствуют DimProduct таблицы, этот запрос возвращает те же строки, как в первом примере внутреннее соединение выше.

-- Uses AdventureWorks  
  
SELECT fis.SalesOrderNumber, dp.ProductKey, dp.EnglishProductName  
FROM FactInternetSales AS fis LEFT OUTER JOIN DimProduct AS dp  
ON dp.ProductKey = fis.ProductKey;  

Этот запрос может быть записан без OUTER ключевое слово.

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

-- Uses AdventureWorks  
  
SELECT fis.SalesOrderNumber, dp.ProductKey, dp.EnglishProductName  
FROM DimProduct AS dp RIGHT OUTER JOIN FactInternetSales AS fis  
ON dp.ProductKey = fis.ProductKey;  

В следующем запросе используется DimSalesTerritory качестве левой таблицы в левое внешнее соединение. Он извлекает SalesOrderNumber значения из FactInternetSales таблицы. Если нет заказов для определенного SalesTerritoryKey, запрос будет возвращать значение NULL для SalesOrderNumber для этой строки. Этот запрос упорядочен по SalesOrderNumber столбец, таким образом, чтобы все значения NULL в этом столбце будет отображаться в верхней части результатов.

-- Uses AdventureWorks  
  
SELECT dst.SalesTerritoryKey, dst.SalesTerritoryRegion, fis.SalesOrderNumber  
FROM DimSalesTerritory AS dst LEFT OUTER JOIN FactInternetSales AS fis  
ON dst.SalesTerritoryKey = fis.SalesTerritoryKey  
ORDER BY fis.SalesOrderNumber;  

Этот запрос можно переписать с правого внешнего соединения для получения тех же результатов:

-- Uses AdventureWorks  
  
SELECT dst.SalesTerritoryKey, dst.SalesTerritoryRegion, fis.SalesOrderNumber  
FROM FactInternetSales AS fis RIGHT OUTER JOIN DimSalesTerritory AS dst  
ON fis.SalesTerritoryKey = dst.SalesTerritoryKey  
ORDER BY fis.SalesOrderNumber;  

У. С помощью синтаксиса FULL OUTER JOIN

В следующем примере показано полное внешнее соединение, которое возвращает все строки из обеих объединенных таблицах, но возвращает значение NULL для значений, которые не соответствуют из другой таблицы.

-- Uses AdventureWorks  
  
SELECT dst.SalesTerritoryKey, dst.SalesTerritoryRegion, fis.SalesOrderNumber  
FROM DimSalesTerritory AS dst FULL OUTER JOIN FactInternetSales AS fis  
ON dst.SalesTerritoryKey = fis.SalesTerritoryKey  
ORDER BY fis.SalesOrderNumber;  

Этот запрос может быть записан без OUTER ключевое слово.

-- Uses AdventureWorks  
  
SELECT dst.SalesTerritoryKey, dst.SalesTerritoryRegion, fis.SalesOrderNumber  
FROM DimSalesTerritory AS dst FULL JOIN FactInternetSales AS fis  
ON dst.SalesTerritoryKey = fis.SalesTerritoryKey  
ORDER BY fis.SalesOrderNumber;  

Ф. Использование синтаксиса CROSS JOIN

В следующем примере возвращается перекрестное произведение FactInternetSales и DimSalesTerritory таблицы. Список всех возможных комбинаций SalesOrderNumber и SalesTerritoryKey возвращаются. Обратите внимание на отсутствие ON предложение в запросе перекрестного соединения.

-- Uses AdventureWorks  
  
SELECT dst.SalesTerritoryKey, fis.SalesOrderNumber  
FROM DimSalesTerritory AS dst CROSS JOIN FactInternetSales AS fis  
ORDER BY fis.SalesOrderNumber;  

Х. Использование производной таблицы

Следующий пример использует производную таблицу ( SELECT инструкции после FROM предложение) для возврата CustomerKey и LastName столбцы всех клиентов в DimCustomer в таблице BirthDate значения позднее, чем 1 января 1970 года и последнего имени 'Smith'.

-- Uses AdventureWorks  
  
SELECT CustomerKey, LastName  
FROM  
   (SELECT * FROM DimCustomer  
    WHERE BirthDate > '01/01/1970') AS DimCustomerDerivedTable  
WHERE LastName = 'Smith'  
ORDER BY LastName;  

T. УМЕНЬШИТЬ пример указание соединения

В следующем примере используется REDUCE подсказка соединения для изменения обработки производной таблицы в запросе. При использовании REDUCE указание соединения в этом запросе fis.ProductKey запланировано, реплицируется и внесенные distinct и затем присоединить их к DimProduct при случайном порядке из DimProduct на ProductKey. Результирующая таблица производного распространяется на fis.ProductKey.

-- Uses AdventureWorks  
  
EXPLAIN SELECT SalesOrderNumber  
FROM  
   (SELECT fis.SalesOrderNumber, dp.ProductKey, dp.EnglishProductName  
    FROM DimProduct AS dp   
      INNER REDUCE JOIN FactInternetSales AS fis   
      ON dp.ProductKey = fis.ProductKey  
   ) AS dTable  
ORDER BY SalesOrderNumber;  

Ф. Пример указания REPLICATE соединения

Следующий пример демонстрирует тот же запрос, как в предыдущем примере, за исключением того, что REPLICATE указание соединения используется вместо REDUCE подсказка соединения. Использование REPLICATE указание вызывает значений в ProductKey (объединяющий) столбец из FactInternetSales таблицы реплицируются на все узлы. DimProduct Таблица соединяется с реплицированной версии этих значений.

-- Uses AdventureWorks  
  
EXPLAIN SELECT SalesOrderNumber  
FROM  
   (SELECT fis.SalesOrderNumber, dp.ProductKey, dp.EnglishProductName  
    FROM DimProduct AS dp   
      INNER REPLICATE JOIN FactInternetSales AS fis  
      ON dp.ProductKey = fis.ProductKey  
   ) AS dTable  
ORDER BY SalesOrderNumber;  

Х. Использование подсказки РАСПРОСТРАНЕНИЯ для обеспечения перемещения в случайном порядке для объединения несовместимых распространения

Следующий запрос использует указание ПОВТОРИТЬ запрос на соединение несовместимые распространения. Это гарантирует, что оптимизатор запросов будет использовать перемещения в случайном порядке в плане запроса. Это также гарантирует, что план запроса не будет использовать перемещения широковещательной рассылки, который перемещает распределенные таблицы в реплицированную таблицу.

В следующем примере указание ПОВТОРИТЬ вынуждает перемещения в случайном порядке для таблицы FactInternetSales, поскольку ProductKey столбцом распределения для DimProduct и не является столбцом распределения для FactInternetSales.

-- Uses AdventureWorks  
  
EXPLAIN  
SELECT dp.ProductKey, fis.SalesOrderNumber, fis.TotalProductCost  
FROM DimProduct dp INNER REDISTRIBUTE JOIN FactInternetSales fis  
ON dp.ProductKey = fis.ProductKey;  

Функции CONTAINSTABLE (Transact-SQL)
DELETE (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
INSERT (Transact-SQL)
OPENQUERY (Transact-SQL)
OPENROWSET (Transact-SQL)
Операторы (Transact-SQL)
ОБНОВЛЕНИЕ (Transact-SQL)
ГДЕ (Transact-SQL)