Cláusula FROM mais JOIN, APPLY, PIVOT (Transact-SQL)FROM clause plus JOIN, APPLY, PIVOT (Transact-SQL)

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simSQL Data Warehouse do Azure simParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

No Transact-SQL, a cláusula FROM está disponível nas seguintes instruções:In Transact-SQL, the FROM clause is available on the following statements:

A cláusula FROM geralmente é necessária na instrução SELECT.The FROM clause is usually required on the SELECT statement. A exceção é quando nenhuma coluna de tabela é listada e os únicos itens listados são literais ou variáveis ou expressões aritméticas.The exception is when no table columns are listed, and the only items listed are literals or variables or arithmetic expressions.

Este artigo também descreve as seguintes palavras-chave que podem ser usadas na cláusula FROM:This article also discusses the following keywords that can be used on the FROM clause:

  • JOINJOIN
  • APPLYAPPLY
  • PIVOTPIVOT

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

-- 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 
    [<tablesample_clause>]  
    | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]  
    | <joined_table>  
}  
  
<tablesample_clause> ::=
    TABLESAMPLE ( sample_number [ PERCENT ] ) -- SQL Data Warehouse only  
 
<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  

ArgumentosArguments

<table_source><table_source>
Especifica uma tabela, exibição, variável de tabela ou origem de tabela derivada, com ou sem um alias, a ser usada na instrução Transact-SQLTransact-SQL.Specifies a table, view, table variable, or derived table source, with or without an alias, to use in the Transact-SQLTransact-SQL statement. Até 256 origens da tabela podem ser usadas em uma instrução, embora o limite varie de acordo com a memória disponível e a complexidade de outras expressões na consulta.Up to 256 table sources can be used in a statement, although the limit varies depending on available memory and the complexity of other expressions in the query. Consultas individuais podem não aceitar até 256 origens de tabela.Individual queries may not support up to 256 table sources.

Observação

O desempenho da consulta pode ser prejudicado com um grande número de tabelas referenciadas em uma consulta.Query performance may suffer with lots of tables referenced in a query. O tempo de compilação e otimização também é afetado por outros fatores.Compilation and optimization time is also affected by additional factors. Esses fatores incluem a presença de índices e exibições indexadas em cada <table_source> e o tamanho de <select_list> na instrução SELECT.These include the presence of indexes and indexed views on each <table_source> and the size of the <select_list> in the SELECT statement.

A ordem de origens de tabela após a palavra-chave FROM não afeta o conjunto de resultados que é retornado.The order of table sources after the FROM keyword does not affect the result set that is returned. O SQL ServerSQL Server retorna erros quando aparecem nomes duplicados na cláusula FROM.SQL ServerSQL Server returns errors when duplicate names appear in the FROM clause.

table_or_view_nametable_or_view_name
É o nome de uma tabela ou exibição.Is the name of a table or view.

Se a tabela ou exibição existir em outro banco de dados na mesma instância do SQL ServerSQL Server, use um nome totalmente qualificado no formato database.schema.object_name.If the table or view exists in another database on the same instance of SQL ServerSQL Server, use a fully qualified name in the form database.schema.object_name.

Se a tabela ou exibição existir fora da instância do SQL ServerSQL Server, use um nome de quatro partes no formato linked_server.catalog.schema.object.If the table or view exists outside the instance of SQL ServerSQL Serverl, use a four-part name in the form linked_server.catalog.schema.object. Para obter mais informações, consulte sp_addlinkedserver (Transact-SQL).For more information, see sp_addlinkedserver (Transact-SQL). Um nome de quatro partes que é construído por meio da função OPENDATASOURCE como a parte do servidor no nome também pode ser usado para especificar a origem da tabela remota.A four-part name that is constructed by using the OPENDATASOURCE function as the server part of the name can also be used to specify the remote table source. Quando OPENDATASOURCE é especificado, database_name e schema_name podem não se aplicar a todas as fontes de dados e podem estar sujeitos às funcionalidades do Provedor OLE DB que acessa o objeto remoto.When OPENDATASOURCE is specified, database_name and schema_name may not apply to all data sources and is subject to the capabilities of the OLE DB provider that accesses the remote object.

[AS] table_alias[AS] table_alias
É um alias para table_source que pode ser usado por conveniência ou para distinguir uma tabela ou exibição em uma autojunção ou subconsulta.Is an alias for table_source that can be used either for convenience or to distinguish a table or view in a self-join or subquery. Em geral, um alias é um nome de tabela abreviado usado para referência a colunas específicas das tabelas em uma junção.An alias is frequently a shortened table name used to refer to specific columns of the tables in a join. Se o nome da coluna existir em mais de uma tabela na junção, o SQL ServerSQL Server exigirá que ele seja qualificado por um nome de tabela, nome de exibição ou alias.If the same column name exists in more than one table in the join, SQL ServerSQL Server requires that the column name be qualified by a table name, view name, or alias. O nome da tabela não poderá ser usado se um alias estiver definido.The table name cannot be used if an alias is defined.

Quando uma tabela derivada, um conjunto de linhas, uma função com valor de tabela ou uma cláusula de operador (como PIVOT ou UNPIVOT) é usado, o table_alias obrigatório no final da cláusula é o nome da tabela associado para todas as colunas retornadas, incluindo colunas de agrupamento.When a derived table, rowset or table-valued function, or operator clause (such as PIVOT or UNPIVOT) is used, the required table_alias at the end of the clause is the associated table name for all columns, including grouping columns, returned.

WITH (<table_hint> )WITH (<table_hint> )
Especifica que o otimizador de consulta use uma estratégia de otimização ou bloqueio com esta tabela e para esta instrução.Specifies that the query optimizer use an optimization or locking strategy with this table and for this statement. Para obter mais informações, consulte Dicas de tabela (Transact-SQL).For more information, see Table Hints (Transact-SQL).

rowset_functionrowset_function

Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de Dados SQLSQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de Dados SQLSQL Database.

Especifica uma das funções de conjunto de linhas, como OPENROWSET, que retorna um objeto que pode ser usado no lugar de uma referência de tabela.Specifies one of the rowset functions, such as OPENROWSET, that returns an object that can be used instead of a table reference. Para obter mais informações sobre uma lista de funções de conjunto de linhas, consulte Funções de conjunto de linhas (Transact-SQL).For more information about a list of rowset functions, see Rowset Functions (Transact-SQL).

O uso das funções OPENROWSET e OPENQUERY para especificar que um objeto remoto depende dos recursos do provedor OLE DB que acessa o objeto.Using the OPENROWSET and OPENQUERY functions to specify a remote object depends on the capabilities of the OLE DB provider that accesses the object.

bulk_column_aliasbulk_column_alias

Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de Dados SQLSQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de Dados SQLSQL Database.

É um alias opcional para substituir um nome de coluna no conjunto de resultados.Is an optional alias to replace a column name in the result set. Os aliases de coluna são permitidos somente em instruções SELECT que usam a função OPENROWSET com a opção BULK.Column aliases are allowed only in SELECT statements that use the OPENROWSET function with the BULK option. Ao usar bulk_column_alias, especifique um alias para cada coluna da tabela na mesma ordem que as colunas no arquivo.When you use bulk_column_alias, specify an alias for every table column in the same order as the columns in the file.

Observação

Este alias substitui o atributo NAME nos elementos COLUMN de um arquivo de formato XML, se houver.This alias overrides the NAME attribute in the COLUMN elements of an XML format file, if present.

user_defined_functionuser_defined_function
Especifica uma função com valor de tabela.Specifies a table-valued function.

OPENXML <openxml_clause>OPENXML <openxml_clause>

Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017 e Banco de Dados SQLSQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and Banco de Dados SQLSQL Database.

Fornece uma exibição de conjunto de linhas em um documento XML.Provides a rowset view over an XML document. Para obter mais informações, consulte OPENXML (SQL Server).For more information, see OPENXML (Transact-SQL).

derived_tablederived_table
É uma subconsulta que recupera linhas do banco de dados.Is a subquery that retrieves rows from the database. derived_table é usada como entrada para a consulta externa.derived_table is used as input to the outer query.

derived _table pode usar o recurso do construtor de valor de tabela Transact-SQLTransact-SQL para especificar várias linhas.derived _table can use the Transact-SQLTransact-SQL table value constructor feature to specify multiple rows. Por exemplo, SELECT * FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);.For example, SELECT * FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);. Para obter mais informações, consulte Construtor de valor de tabela (Transact-SQL).For more information, see Table Value Constructor (Transact-SQL).

column_aliascolumn_alias
É um alias opcional para substituir um nome de coluna no conjunto de resultados da tabela derivada.Is an optional alias to replace a column name in the result set of the derived table. Inclua um alias para cada coluna na lista de seleção e encerre a lista completa de aliases de coluna entre parênteses.Include one column alias for each column in the select list, and enclose the complete list of column aliases in parentheses.

table_or_view_name FOR SYSTEM_TIME <system_time>table_or_view_name FOR SYSTEM_TIME <system_time>

Aplica-se a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) a SQL Server 2017SQL Server 2017 e Banco de Dados SQLSQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Banco de Dados SQLSQL Database.

Especifica que uma versão específica dos dados é retornada da tabela temporal especificada e sua tabela de histórico vinculada com controle de versão do sistemaSpecifies that a specific version of data is returned from the specified temporal table and its linked system-versioned history table

Cláusula TablesampleTablesample clause

Aplica-se a: SQL Server, Banco de Dados SQLApplies to: SQL Server, SQL Database

Especifica que uma amostra de dados da tabela é retornada.Specifies that a sample of data from the table is returned. A amostra pode ser aproximada.The sample may be approximate. Esta cláusula pode ser usada em qualquer tabela primária ou unida em uma instrução SELECT ou UPDATE.This clause can be used on any primary or joined table in a SELECT or UPDATE statement. TABLESAMPLE não pode ser especificado com exibições.TABLESAMPLE cannot be specified with views.

Observação

Quando você usa TABLESAMPLE em bancos de dados atualizados para o SQL ServerSQL Server, o nível de compatibilidade do banco de dados é definido como 110 ou mais alto, PIVOT não é permitido em uma consulta CTE (expressão de tabela comum) recursiva.When you use TABLESAMPLE against databases that are upgraded to SQL ServerSQL Server, the compatibility level of the database is set to 110 or higher, PIVOT is not allowed in a recursive common table expression (CTE) query. Para obter mais informações, veja Nível de compatibilidade de ALTER DATABASE (Transact-SQL).For more information, see ALTER DATABASE Compatibility Level (Transact-SQL).

SYSTEMSYSTEM
É um método de amostragem dependente de implementação especificado por padrões ISO.Is an implementation-dependent sampling method specified by ISO standards. No SQL ServerSQL Server, esse é o único método de amostragem disponível e é aplicado por padrão.In SQL ServerSQL Server, this is the only sampling method available and is applied by default. SYSTEM aplica um método de amostragem baseado em páginas em que um conjunto aleatório de páginas de uma tabela é escolhido para a amostra, e todas as linhas dessas páginas são retornadas como subconjunto da amostra.SYSTEM applies a page-based sampling method in which a random set of pages from the table is chosen for the sample, and all the rows on those pages are returned as the sample subset.

sample_numbersample_number
É uma expressão numérica constante exata ou aproximada que representa o percentual ou o número de linhas.Is an exact or approximate constant numeric expression that represents the percent or number of rows. Quando especificado com PERCENT, sample_number é convertido implicitamente em um valor float; caso contrário, é convertido em bigint.When specified with PERCENT, sample_number is implicitly converted to a float value; otherwise, it is converted to bigint. PERCENT é o padrão.PERCENT is the default.

PERCENTPERCENT
Especifica que um percentual sample_number das linhas da tabela deve ser recuperado da tabela.Specifies that a sample_number percent of the rows of the table should be retrieved from the table. Quando PERCENT é especificado, o SQL ServerSQL Server retorna um valor aproximado do percentual especificado.When PERCENT is specified, SQL ServerSQL Server returns an approximate of the percent specified. Quando PERCENT é especificado, a expressão sample_number deve ser avaliada como um valor de 0 a 100.When PERCENT is specified the sample_number expression must evaluate to a value from 0 to 100.

ROWSROWS
Especifica que, aproximadamente, sample_number de linhas será recuperado.Specifies that approximately sample_number of rows will be retrieved. Quando ROWS é especificado, o SQL ServerSQL Server retorna uma aproximação do número de linhas especificado.When ROWS is specified, SQL ServerSQL Server returns an approximation of the number of rows specified. Quando ROWS é especificado, a expressão sample_number deve ser avaliada como um valor inteiro maior que zero.When ROWS is specified, the sample_number expression must evaluate to an integer value greater than zero.

REPEATABLEREPEATABLE
Indica que a amostra selecionada pode ser retornada novamente.Indicates that the selected sample can be returned again. Quando for especificado com o mesmo valor de repeat_seed, o SQL ServerSQL Server retornará o mesmo subconjunto de linhas, desde que não seja feita nenhuma alteração nas linhas da tabela.When specified with the same repeat_seed value, SQL ServerSQL Server will return the same subset of rows as long as no changes have been made to any rows in the table. Quando for especificado com outro valor de repeat_seed, o SQL ServerSQL Server provavelmente retornará uma amostra diferente das linhas da tabela.When specified with a different repeat_seed value, SQL ServerSQL Server will likely return some different sample of the rows in the table. As seguintes ações na tabela são consideradas alterações: inserir, atualizar, excluir, recompilação do índice ou desfragmentação e restauração ou anexação do banco de dados.The following actions to the table are considered changes: insert, update, delete, index rebuild or defragmentation, and database restore or attach.

repeat_seedrepeat_seed
É uma expressão de inteiro constante usada pelo SQL ServerSQL Server para gerar um número aleatório.Is a constant integer expression used by SQL ServerSQL Server to generate a random number. repeat_seed é bigint.repeat_seed is bigint. Se repeat_seed não for especificado, SQL ServerSQL Server atribuirá um valor aleatório.If repeat_seed is not specified, SQL ServerSQL Server assigns a value at random. Para um valor repeat_seed específico, o resultado da amostragem será sempre o mesmo se nenhuma alteração tiver sido aplicada à tabela.For a specific repeat_seed value, the sampling result is always the same if no changes have been applied to the table. A expressão repeat_seed deve ser avaliada como um inteiro maior que zero.The repeat_seed expression must evaluate to an integer greater than zero.

Cláusula TablesampleTablesample clause

Aplica-se a: SQL Data WarehouseApplies to: SQL Data Warehouse

Especifica que uma amostra de dados da tabela é retornada.Specifies that a sample of data from the table is returned. A amostra pode ser aproximada.The sample may be approximate. Esta cláusula pode ser usada em qualquer tabela primária ou unida em uma instrução SELECT ou UPDATE.This clause can be used on any primary or joined table in a SELECT or UPDATE statement. TABLESAMPLE não pode ser especificado com exibições.TABLESAMPLE cannot be specified with views.

PERCENTPERCENT
Especifica que um percentual sample_number das linhas da tabela deve ser recuperado da tabela.Specifies that a sample_number percent of the rows of the table should be retrieved from the table. Quando PERCENT é especificado, o SQL Data Warehouse retorna um valor aproximado do percentual especificado.When PERCENT is specified, SQL Data Warehouse returns an approximate of the percent specified. Quando PERCENT é especificado, a expressão sample_number precisa ser avaliada como um valor de 0 a 100.When PERCENT is specified, the sample_number expression must evaluate to a value from 0 to 100.

Tabela unidaJoined table

Uma tabela unida é um conjunto de resultados que é o produto de duas ou mais tabelas.A joined table is a result set that is the product of two or more tables. Para várias junções, use parênteses para alterar a ordem natural das junções.For multiple joins, use parentheses to change the natural order of the joins.

Tipo de junçãoJoin type

Especifica o tipo de operação de junção.Specifies the type of join operation.

INNERINNER
Especifica todos os pares de linhas correspondentes retornados.Specifies all matching pairs of rows are returned. Descarta as linhas não correspondentes de ambas as tabelas.Discards unmatched rows from both tables. Quando nenhum tipo de junção é especificado, este é o padrão.When no join type is specified, this is the default.

FULL [ OUTER ]FULL [ OUTER ]
Especifica que uma linha da tabela esquerda ou direita que não atende à condição de junção seja incluída no conjunto de resultados, e as colunas de saída correspondentes à outra tabela sejam definidas como NULL.Specifies that a row from either the left or right table that does not meet the join condition is included in the result set, and output columns that correspond to the other table are set to NULL. Isso ocorre além de todas as linhas normalmente retornadas por INNER JOIN.This is in addition to all rows typically returned by the INNER JOIN.

LEFT [ OUTER ]LEFT [ OUTER ]
Especifica que todas as linhas da tabela esquerda que não atendem à condição de junção sejam incluídas no conjunto de resultados, e as colunas de saída da outra tabela sejam definidas como NULL além de todas as linhas retornadas pela junção interna.Specifies that all rows from the left table not meeting the join condition are included in the result set, and output columns from the other table are set to NULL in addition to all rows returned by the inner join.

RIGHT [OUTER]RIGHT [OUTER]
Especifica que todas as linhas da tabela direita que não atendem à condição de junção sejam incluídas no conjunto de resultados, e as colunas de saída que correspondem à outra tabela sejam definidas como NULL, além de todas as linhas retornadas pela junção interna.Specifies all rows from the right table not meeting the join condition are included in the result set, and output columns that correspond to the other table are set to NULL, in addition to all rows returned by the inner join.

Dica de junçãoJoin hint

Para o SQL ServerSQL Server e Banco de Dados SQLSQL Database, especifica que o otimizador de consulta do SQL ServerSQL Server usa uma dica de junção, ou um algoritmo de execução, por junção especificada na cláusula FROM da consulta.For SQL ServerSQL Server and Banco de Dados SQLSQL Database, specifies that the SQL ServerSQL Server query optimizer use one join hint, or execution algorithm, per join specified in the query FROM clause. Para obter mais informações, consulte Dicas de junção (Transact-SQL).For more information, see Join Hints (Transact-SQL).

Para o SQL Data WarehouseSQL Data Warehouse e Parallel Data WarehouseParallel Data Warehouse, essas dicas de junção se aplicam a junções INNER em duas colunas incompatíveis com a distribuição.For SQL Data WarehouseSQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse, these join hints apply to INNER joins on two distribution incompatible columns. Elas podem melhorar o desempenho da consulta restringindo a quantidade de movimentação de dados que ocorre durante o processamento da consulta.They can improve query performance by restricting the amount of data movement that occurs during query processing. As dicas de junção permitidas para o SQL Data WarehouseSQL Data Warehouse e Parallel Data WarehouseParallel Data Warehouse são as seguintes:The allowable join hints for SQL Data WarehouseSQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse are as follows:

REDUCEREDUCE
Reduz o número de linhas a serem movidas para a tabela no lado direito da junção, a fim de tornar compatíveis as duas tabelas incompatíveis com a distribuição.Reduces the number of rows to be moved for the table on the right side of the join in order to make two distribution incompatible tables compatible. A dica REDUCE também é chamada de uma dica de semijunção.The REDUCE hint is also called a semi-join hint.

REPLICATEREPLICATE
Faz com que os valores na coluna de junção da tabela no lado esquerdo da junção sejam replicados para todos os nós.Causes the values in the joining column from the table on the left side of the join to be replicated to all nodes. A tabela à direita é unida à versão replicada dessas colunas.The table on the right is joined to the replicated version of those columns.

REDISTRIBUTEREDISTRIBUTE
Força duas fontes de dados a serem distribuídas nas colunas especificadas na cláusula JOIN.Forces two data sources to be distributed on columns specified in the JOIN clause. Para uma tabela distribuída, o Parallel Data WarehouseParallel Data Warehouse executará uma movimentação de ordem aleatória.For a distributed table, Parallel Data WarehouseParallel Data Warehouse will perform a shuffle move. Para uma tabela replicada, o Parallel Data WarehouseParallel Data Warehouse executará uma movimentação de corte.For a replicated table, Parallel Data WarehouseParallel Data Warehouse will perform a trim move. Para entender esses tipos de movimentação, consulte a seção "Operações de plano de consulta DMS" no tópico "Noções básicas sobre planos de consulta" no Documentação de produto do Parallel Data WarehouseParallel Data Warehouse product documentation.To understand these move types, see the "DMS Query Plan Operations" section in the "Understanding Query Plans" topic in the Documentação de produto do Parallel Data WarehouseParallel Data Warehouse product documentation. Essa dica pode melhorar o desempenho quando o plano de consulta usa uma movimentação de difusão para resolver uma junção incompatível com a distribuição.This hint can improve performance when the query plan is using a broadcast move to resolve a distribution incompatible join.

JOINJOIN
Indica que a operação de junção especificada deve acontecer entre as origens de tabela ou exibições especificadas.Indicates that the specified join operation should occur between the specified table sources or views.

ON <search_condition>ON <search_condition>
Especifica o critério no qual a junção se baseia.Specifies the condition on which the join is based. Os critérios podem especificar qualquer predicado, embora colunas e operadores de comparação sejam frequentemente usados, por exemplo:The condition can specify any predicate, although columns and comparison operators are frequently used, for example:

SELECT p.ProductID, v.BusinessEntityID  
FROM Production.Product AS p   
JOIN Purchasing.ProductVendor AS v  
ON (p.ProductID = v.ProductID);  
  

Quando o critério especifica colunas, estas não precisam ter o mesmo nome ou o mesmo tipo de dados; no entanto, se os tipos de dados não forem iguais, eles deverão ser compatíveis ou tipos que o SQL ServerSQL Server possa converter implicitamente.When the condition specifies columns, the columns do not have to have the same name or same data type; however, if the data types are not the same, they must be either compatible or types that SQL ServerSQL Server can implicitly convert. Se os tipos de dados não puderem ser convertidos implicitamente, o critério deverá converter o tipo de dados explicitamente usando a função CONVERT.If the data types cannot be implicitly converted, the condition must explicitly convert the data type by using the CONVERT function.

Poderá haver predicados que envolvam somente uma das tabelas unidas na cláusula ON.There can be predicates that involve only one of the joined tables in the ON clause. Tais predicados também podem estar na cláusula WHERE da consulta.Such predicates also can be in the WHERE clause in the query. Embora a presença de tais predicados não faça diferença para junções INNER, eles podem gerar um resultado diferente quando junções OUTER estão envolvidas.Although the placement of such predicates does not make a difference for INNER joins, they might cause a different result when OUTER joins are involved. Isso ocorre porque os predicados na cláusula ON são aplicados à tabela antes da junção, ao passo que a cláusula WHERE é semanticamente aplicada ao resultado da junção.This is because the predicates in the ON clause are applied to the table before the join, whereas the WHERE clause is semantically applied to the result of the join.

Para obter mais informações sobre critérios de pesquisa e predicados, consulte Critério de pesquisa (Transact-SQL).For more information about search conditions and predicates, see Search Condition (Transact-SQL).

CROSS JOINCROSS JOIN
Especifica o produto cruzado de duas tabelas.Specifies the cross-product of two tables. Retorna as mesmas linhas como se nenhuma cláusula WHERE estivesse especificada em uma junção em estilo antigo que não seja SQL-92.Returns the same rows as if no WHERE clause was specified in an old-style, non-SQL-92-style join.

left_table_source { CROSS | OUTER } APPLY right_table_sourceleft_table_source { CROSS | OUTER } APPLY right_table_source
Especifica que a right_table_source do operador APPLY é avaliada em cada linha da left_table_source.Specifies that the right_table_source of the APPLY operator is evaluated against every row of the left_table_source. Essa funcionalidade é útil quando a right_table_source contém uma função com valor de tabela que usa valores de coluna da left_table_source como um de seus argumentos.This functionality is useful when the right_table_source contains a table-valued function that takes column values from the left_table_source as one of its arguments.

É necessário especificar CROSS ou OUTER com APPLY.Either CROSS or OUTER must be specified with APPLY. Quando CROSS é especificado, nenhuma linha é produzida quando a right_table_source é avaliada em uma linha especificada da left_table_source e retorna um conjunto de resultados vazio.When CROSS is specified, no rows are produced when the right_table_source is evaluated against a specified row of the left_table_source and returns an empty result set.

Quando OUTER é especificado, uma linha é produzida para cada linha da left_table_source, mesmo quando a right_table_source é avaliada nessa linha e retorna um conjunto de resultados vazio.When OUTER is specified, one row is produced for each row of the left_table_source even when the right_table_source evaluates against that row and returns an empty result set.

Para obter mais informações, consulte a seção Comentários.For more information, see the Remarks section.

left_table_sourceleft_table_source
É uma origem de tabela conforme a definição no argumento anterior.Is a table source as defined in the previous argument. Para obter mais informações, consulte a seção Comentários.For more information, see the Remarks section.

right_table_sourceright_table_source
É uma origem de tabela conforme a definição no argumento anterior.Is a table source as defined in the previous argument. Para obter mais informações, consulte a seção Comentários.For more information, see the Remarks section.

Cláusula PIVOTPIVOT clause

table_source PIVOT <pivot_clause>table_source PIVOT <pivot_clause>
Especifica que a table_source é dinamizada com base na pivot_column.Specifies that the table_source is pivoted based on the pivot_column. table_source é uma tabela ou uma expressão de tabela.table_source is a table or table expression. A saída é uma tabela que contém todas as colunas da table_source, exceto a pivot_column e value_column.The output is a table that contains all columns of the table_source except the pivot_column and value_column. As colunas da table_source, exceto a pivot_column e a value_column, são chamadas as colunas de agrupamento do operador original.The columns of the table_source, except the pivot_column and value_column, are called the grouping columns of the pivot operator. Para obter mais informações sobre PIVOT e UNPIVOT, consulte Usando PIVOT e UNPIVOT.For more information about PIVOT and UNPIVOT, see Using PIVOT and UNPIVOT.

PIVOT executa uma operação de agrupamento na tabela de entrada em relação às colunas de agrupamento e retorna uma linha para cada grupo.PIVOT performs a grouping operation on the input table with regard to the grouping columns and returns one row for each group. Além disso, a saída contém uma coluna para cada valor especificado na column_list exibido na pivot_column da input_table.Additionally, the output contains one column for each value specified in the column_list that appears in the pivot_column of the input_table.

Para obter mais informações, consulte a seção Comentários a seguir.For more information, see the Remarks section that follows.

aggregate_functionaggregate_function
É um sistema ou uma função de agregação definida pelo usuário que aceita uma ou mais entradas.Is a system or user-defined aggregate function that accepts one or more inputs. A função de agregação deve ser invariável para valores nulos.The aggregate function should be invariant to null values. Uma função de agregação invariável para valores nulos não considera valores nulos no grupo enquanto está avaliando o valor de agregação.An aggregate function invariant to null values does not consider null values in the group while it is evaluating the aggregate value.

A função de agregação de sistema COUNT (*) não é permitida.The COUNT(*) system aggregate function is not allowed.

value_columnvalue_column
É a coluna de valor do operador PIVOT.Is the value column of the PIVOT operator. Quando usado com UNPIVOT, value_column não pode ser o nome de uma coluna existente na table_source de entrada.When used with UNPIVOT, value_column cannot be the name of an existing column in the input table_source.

FOR pivot_columnFOR pivot_column
É a coluna dinâmica do operador PIVOT.Is the pivot column of the PIVOT operator. pivot_column deve ser de um tipo implícita ou explicitamente conversível em nvarchar() .pivot_column must be of a type implicitly or explicitly convertible to nvarchar(). Esta coluna não pode ser image ou rowversion.This column cannot be image or rowversion.

Quando UNPIVOT é usado, pivot_column é o nome da coluna de saída que é reduzida com base na table_source.When UNPIVOT is used, pivot_column is the name of the output column that becomes narrowed from the table_source. Não pode haver uma coluna em table_source com esse nome.There cannot be an existing column in table_source with that name.

IN (column_list )IN (column_list )
Na cláusula PIVOT, lista os valores na pivot_column que se tornarão os nomes de coluna da tabela de saída.In the PIVOT clause, lists the values in the pivot_column that will become the column names of the output table. A lista não pode especificar nomes de coluna já existentes na table_source de entrada que está sendo dinamizada.The list cannot specify any column names that already exist in the input table_source that is being pivoted.

Na cláusula UNPIVOT, lista as colunas na table_source que serão reduzidas a uma única pivot_column.In the UNPIVOT clause, lists the columns in table_source that will be narrowed into a single pivot_column.

table_aliastable_alias
É o nome do alias da tabela de saída.Is the alias name of the output table. pivot_table_alias deve ser especificado.pivot_table_alias must be specified.

UNPIVOT <unpivot_clause>UNPIVOT <unpivot_clause>
Especifica que a tabela de entrada é reduzida com base em várias colunas na column_list a uma única coluna chamada pivot_column.Specifies that the input table is narrowed from multiple columns in column_list into a single column called pivot_column. Para obter mais informações sobre PIVOT e UNPIVOT, consulte Usando PIVOT e UNPIVOT.For more information about PIVOT and UNPIVOT, see Using PIVOT and UNPIVOT.

AS OF <date_time>AS OF <date_time>

Aplica-se a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) a SQL Server 2017SQL Server 2017 e Banco de Dados SQLSQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Banco de Dados SQLSQL Database.

Retorna uma tabela com um único registro para cada linha que contém os valores que foram reais (atuais) no momento passado especificado.Returns a table with single record for each row containing the values that were actual (current) at the specified point in time in the past. Internamente, uma união é executada entre a tabela temporal e sua tabela de histórico e os resultados são filtrados para retornar os valores na linha que era válida no ponto no tempo especificado pelo parâmetro <date_time> .Internally, a union is performed between the temporal table and its history table and the results are filtered to return the values in the row that was valid at the point in time specified by the <date_time> parameter. O valor de uma linha é considerado válido se o valor de system_start_time_column_name é menor ou igual ao valor do parâmetro <date_time> e o valor de system_end_time_column_name é maior que o valor do parâmetro <date_time> .The value for a row is deemed valid if the system_start_time_column_name value is less than or equal to the <date_time> parameter value and the system_end_time_column_name value is greater than the <date_time> parameter value.

FROM <start_date_time> TO <end_date_time>FROM <start_date_time> TO <end_date_time>

Aplica-se a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) a SQL Server 2017SQL Server 2017 e Banco de Dados SQLSQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Banco de Dados SQLSQL Database.

Retorna uma tabela com os valores para todas as versões de registro que estavam ativas no intervalo de tempo especificado, sem levar em conta se eles começaram a estar ativos antes do valor de parâmetro <start_date_time> para o argumento FROM ou deixaram de estar ativos após o valor de parâmetro <end_date_time> para o argumento TO.Returns a table with the values for all record versions that were active within the specified time range, regardless of whether they started being active before the <start_date_time> parameter value for the FROM argument or ceased being active after the <end_date_time> parameter value for the TO argument. Internamente, uma união é executada entre a tabela temporal e sua tabela de histórico e os resultados são filtrados para retornar os valores para todas as versões de linha que estavam ativas a qualquer momento durante o intervalo de tempo especificado.Internally, a union is performed between the temporal table and its history table and the results are filtered to return the values for all row versions that were active at any time during the time range specified. As linhas que se tornaram ativas exatamente no limite inferior definido pelo ponto de extremidade FROM são incluídas e as linhas que se tornaram ativas exatamente no limite superior definido pelo ponto de extremidade TO não são incluídas.Rows that became active exactly on the lower boundary defined by the FROM endpoint are included and rows that became active exactly on the upper boundary defined by the TO endpoint are not included.

BETWEEN <start_date_time> AND <end_date_time>BETWEEN <start_date_time> AND <end_date_time>

Aplica-se a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) a SQL Server 2017SQL Server 2017 e Banco de Dados SQLSQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Banco de Dados SQLSQL Database.

A mesma descrição acima para FROM <start_date_time> TO <end_date_time> é válida, exceto que ela inclui linhas que se tornaram ativas no limite superior definido pelo ponto de extremidade <end_date_time>.Same as above in the FROM <start_date_time> TO <end_date_time> description, except it includes rows that became active on the upper boundary defined by the <end_date_time> endpoint.

CONTAINED IN (<start_date_time>, <end_date_time>)CONTAINED IN (<start_date_time> , <end_date_time>)

Aplica-se a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) a SQL Server 2017SQL Server 2017 e Banco de Dados SQLSQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Banco de Dados SQLSQL Database.

Retorna uma tabela com os valores para todas as versões de registro que foram abertas e fechadas dentro do intervalo de tempo especificado definido por dois valores de data e hora para o argumento CONTAINED IN.Returns a table with the values for all record versions that were opened and closed within the specified time range defined by the two datetime values for the CONTAINED IN argument. As linhas que se tornaram ativas exatamente no limite inferior ou que deixaram de ser ativas exatamente no limite superior são incluídas.Rows that became active exactly on the lower boundary or ceased being active exactly on the upper boundary are included.

ALLALL
Retorna uma tabela com os valores de todas as linhas da tabela atual e da tabela de histórico.Returns a table with the values from all rows from both the current table and the history table.

RemarksRemarks

A cláusula FROM aceita a sintaxe SQL-92 para tabelas unidas e derivadas.The FROM clause supports the SQL-92-SQL syntax for joined tables and derived tables. Sintaxe SQL-92 fornece os operadores de junção INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER e CROSS.SQL-92 syntax provides the INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER, and CROSS join operators.

Há suporte para UNION e JOIN em uma cláusula FROM dentro de exibições e em tabelas derivadas e subconsultas.UNION and JOIN within a FROM clause are supported within views and in derived tables and subqueries.

Uma autojunção é uma tabela unida a ela mesma.A self-join is a table that is joined to itself. As operações de inserção ou atualização que são baseadas em uma autojunção seguem a ordem da cláusula FROM.Insert or update operations that are based on a self-join follow the order in the FROM clause.

Como o SQL ServerSQL Server considera as estatísticas de distribuição e cardinalidade de servidores vinculados que fornecem estatísticas de distribuição de coluna, a dica de junção REMOTE não é necessária para impor a avaliação de uma junção remotamente.Because SQL ServerSQL Server considers distribution and cardinality statistics from linked servers that provide column distribution statistics, the REMOTE join hint is not required to force evaluating a join remotely. O processador de consulta do SQL ServerSQL Server considera estatísticas remotas e determina se uma estratégia da junção remota é apropriada.The SQL ServerSQL Server query processor considers remote statistics and determines whether a remote-join strategy is appropriate. A dica de junção REMOTE é útil para provedores que não fornecem estatísticas de distribuição de coluna.REMOTE join hint is useful for providers that do not provide column distribution statistics.

Usando APPLYUsing APPLY

Ambos os operandos à esquerda e à direita do operador APPLY são expressões de tabela.Both the left and right operands of the APPLY operator are table expressions. A principal diferença entre esses operandos é que right_table_source pode usar uma função com valor de tabela que usa uma coluna da left_table_source como um dos argumentos da função.The main difference between these operands is that the right_table_source can use a table-valued function that takes a column from the left_table_source as one of the arguments of the function. A left_table_source pode incluir funções com valor de tabela, mas não pode conter argumentos que são colunas da right_table_source.The left_table_source can include table-valued functions, but it cannot contain arguments that are columns from the right_table_source.

O operador APPLY funciona da seguinte maneira para criar a origem de tabela para a cláusula FROM:The APPLY operator works in the following way to produce the table source for the FROM clause:

  1. Avalia right_table_source em cada linha da left_table_source para produzir conjuntos de linhas.Evaluates right_table_source against each row of the left_table_source to produce rowsets.

    Os valores na right_table_source dependem de left_table_source.The values in the right_table_source depend on left_table_source. right_table_source pode ser representada aproximadamente da seguinte maneira: TVF(left_table_source.row), em que TVF é uma função com valor de tabela.right_table_source can be represented approximately this way: TVF(left_table_source.row), where TVF is a table-valued function.

  2. Combina os conjuntos de resultados que são produzidos para cada linha na avaliação de right_table_source com a left_table_source executando uma operação UNION ALL.Combines the result sets that are produced for each row in the evaluation of right_table_source with the left_table_source by performing a UNION ALL operation.

    A lista de colunas produzida pelo resultado do operador APPLY é o conjunto de colunas da left_table_source combinado à lista de colunas da right_table_source.The list of columns produced by the result of the APPLY operator is the set of columns from the left_table_source that is combined with the list of columns from the right_table_source.

Usando PIVOT e UNPIVOTUsing PIVOT and UNPIVOT

A pivot_column e a value_column são colunas de agrupamento usadas pelo operador PIVOT.The pivot_column and value_column are grouping columns that are used by the PIVOT operator. Este segue o seguinte processo para obter o conjunto de resultados de saída:PIVOT follows the following process to obtain the output result set:

  1. Executa um GROUP BY em sua input_table nas colunas de agrupamento e produz uma linha de saída para cada grupo.Performs a GROUP BY on its input_table against the grouping columns and produces one output row for each group.

    As colunas de agrupamento na linha de saída obtêm os valores de coluna correspondentes para o grupo na input_table.The grouping columns in the output row obtain the corresponding column values for that group in the input_table.

  2. Gera valores para as colunas da lista de colunas para cada linha de saída da seguinte forma:Generates values for the columns in the column list for each output row by performing the following:

    1. Agrupando ainda as linhas geradas em GROUP BY na etapa anterior na pivot_column.Grouping additionally the rows generated in the GROUP BY in the previous step against the pivot_column.

      Para cada coluna de saída na column_list, selecionando um subgrupo que atenda à condição:For each output column in the column_list, selecting a subgroup that satisfies the condition:

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

    2. aggregate_function é avaliada na value_column desse subgrupo e seu resultado é retornado como o valor da output_column correspondente.aggregate_function is evaluated against the value_column on this subgroup and its result is returned as the value of the corresponding output_column. Se o subgrupo estiver vazio, o SQL ServerSQL Server gerará um valor nulo para essa output_column.If the subgroup is empty, SQL ServerSQL Server generates a null value for that output_column. Se a função de agregação for COUNT e o subgrupo estiver vazio, será retornado zero (0).If the aggregate function is COUNT and the subgroup is empty, zero (0) is returned.

Observação

Os identificadores de coluna na cláusula UNPIVOT seguem a ordenação de catálogo.The column identifiers in the UNPIVOT clause follow the catalog collation. Para o Banco de Dados SQLSQL Database, a ordenação é sempre SQL_Latin1_General_CP1_CI_AS.For Banco de Dados SQLSQL Database, the collation is always SQL_Latin1_General_CP1_CI_AS. Para bancos de dados parcialmente independentes do SQL ServerSQL Server, a ordenação é sempre Latin1_General_100_CI_AS_KS_WS_SC.For SQL ServerSQL Server partially contained databases, the collation is always Latin1_General_100_CI_AS_KS_WS_SC. Se a coluna for combinada com outras colunas, uma cláusula COLLATE (COLLATE DATABASE_DEFAULT) será necessária para evitar conflitos.If the column is combined with other columns, then a collate clause (COLLATE DATABASE_DEFAULT) is required to avoid conflicts.

Para obter mais informações sobre PIVOT e UNPIVOT, incluindo exemplos, consulte Usando PIVOT e UNPIVOT.For more information about PIVOT and UNPIVOT including examples, see Using PIVOT and UNPIVOT.

PermissõesPermissions

Requer as permissões para a instrução DELETE, SELECT ou UPDATE.Requires the permissions for the DELETE, SELECT, or UPDATE statement.

ExemplosExamples

A.A. Usando uma cláusula FROM simplesUsing a simple FROM clause

O exemplo a seguir recupera as colunas TerritoryID e Name da tabela SalesTerritory no banco de dados de exemplo AdventureWorks2012AdventureWorks2012.The following example retrieves the TerritoryID and Name columns from the SalesTerritory table in the AdventureWorks2012AdventureWorks2012 sample database.

SELECT TerritoryID, Name  
FROM Sales.SalesTerritory  
ORDER BY TerritoryID ;  

Aqui está o conjunto de resultados.Here is the result set.

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)  

B.B. Usando as dicas de otimizador TABLOCK e HOLDLOCKUsing the TABLOCK and HOLDLOCK optimizer hints

A transação parcial a seguir mostra como posicionar um bloqueio de tabela compartilhado explícito em Employee e como ler o índice.The following partial transaction shows how to place an explicit shared table lock on Employee and how to read the index. O bloqueio é mantido ao longo de toda a transação.The lock is held throughout the whole transaction.

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

C.C. Usando a sintaxe SQL-92 CROSS JOINUsing the SQL-92 CROSS JOIN syntax

O exemplo a seguir retorna o produto cruzado das tabelas Employee e Department no banco de dados AdventureWorks2012AdventureWorks2012.The following example returns the cross product of the two tables Employee and Department in the AdventureWorks2012AdventureWorks2012 database. Uma lista de todas as possíveis combinações de linhas de BusinessEntityID e todas as linhas de nome de Department é retornada.A list of all possible combinations of BusinessEntityID rows and all Department name rows are returned.

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

D.D. Usando a sintaxe SQL-92 FULL OUTER JOINUsing the SQL-92 FULL OUTER JOIN syntax

O exemplo a seguir retorna o nome do produto e quaisquer ordens de venda correspondentes na tabela SalesOrderDetail no banco de dados AdventureWorks2012AdventureWorks2012.The following example returns the product name and any corresponding sales orders in the SalesOrderDetail table in the AdventureWorks2012AdventureWorks2012 database. Ele também retorna as ordens de venda que não têm produtos listados na tabela Product, bem como produtos com uma ordem de venda diferente daquela listada na tabela Product.It also returns any sales orders that have no product listed in the Product table, and any products with a sales order other than the one listed in the Product table.

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

E.E. Usando a sintaxe SQL-92 LEFT OUTER JOINUsing the SQL-92 LEFT OUTER JOIN syntax

O exemplo a seguir une duas tabelas em ProductID e preserva as linhas não correspondentes da tabela esquerda.The following example joins two tables on ProductID and preserves the unmatched rows from the left table. É feita a correspondência da tabela Product com a tabela SalesOrderDetail nas colunas ProductID em cada tabela.The Product table is matched with the SalesOrderDetail table on the ProductID columns in each table. Todos os produtos, ordenados ou não, aparecem no conjunto de resultados.All products, ordered and not ordered, appear in the result set.

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 ;  

F.F. Usando a sintaxe SQL-92 INNER JOINUsing the SQL-92 INNER JOIN syntax

O exemplo a seguir retorna todos os nomes de produtos e IDs de ordens de venda.The following example returns all product names and sales order IDs.

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

G.G. Usando a sintaxe SQL-92 RIGHT OUTER JOINUsing the SQL-92 RIGHT OUTER JOIN syntax

O exemplo a seguir une duas tabelas em TerritoryID e preserva as linhas não correspondentes da tabela direita.The following example joins two tables on TerritoryID and preserves the unmatched rows from the right table. É feita a correspondência da tabela SalesTerritory com a tabela SalesPerson na coluna TerritoryID em cada tabela.The SalesTerritory table is matched with the SalesPerson table on the TerritoryID column in each table. Todos os vendedores aparecem no conjunto de resultados, tenham ou não um território atribuído.All salespersons appear in the result set, whether or not they are assigned a territory.

SELECT st.Name AS Territory, sp.BusinessEntityID  
FROM Sales.SalesTerritory AS st   
RIGHT OUTER JOIN Sales.SalesPerson AS sp  
ON st.TerritoryID = sp.TerritoryID ;  

H.H. Usando dicas de junção HASH e MERGEUsing HASH and MERGE join hints

O exemplo a seguir executa uma junção de três tabelas entre as tabelas Product, ProductVendor e Vendor para criar uma lista de produtos e seus fornecedores.The following example performs a three-table join among the Product, ProductVendor, and Vendor tables to produce a list of products and their vendors. O otimizador de consulta une Product e ProductVendor (p e pv) usando uma junção MERGE.The query optimizer joins Product and ProductVendor (p and pv) by using a MERGE join. Em seguida, os resultados da junção MERGE de Product e ProductVendor (p e pv) são unidos por HASH à tabela Vendor para criar (p e pv) e v.Next, the results of the Product and ProductVendor MERGE join (p and pv) are HASH joined to the Vendor table to produce (p and pv) and v.

Importante

Após uma dica de junção ser especificada, a palavra-chave INNER não é mais opcional e deve ser explicitamente declarada para a execução de uma INNER JOIN.After a join hint is specified, the INNER keyword is no longer optional and must be explicitly stated for an INNER JOIN to be performed.

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 ;  

I.I. Usando uma tabela derivadaUsing a derived table

O exemplo a seguir usa uma tabela derivada, uma instrução SELECT após a clausula FROM, para retornar o nome e o sobrenome de todos os funcionários e as cidades em que moram.The following example uses a derived table, a SELECT statement after the FROM clause, to return the first and last names of all employees and the cities in which they live.

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;  

J.J. Usando TABLESAMPLE para ler dados de uma amostra de linhas em uma tabelaUsing TABLESAMPLE to read data from a sample of rows in a table

O exemplo a seguir usa TABLESAMPLE na cláusula FROM para retornar aproximadamente 10 por cento de todas as linhas na tabela Customer.The following example uses TABLESAMPLE in the FROM clause to return approximately 10 percent of all the rows in the Customer table.

SELECT *  
FROM Sales.Customer TABLESAMPLE SYSTEM (10 PERCENT) ;  

K.K. Usando APPLYUsing APPLY

O seguinte exemplo presume que as seguintes tabelas e função com valor de tabela estejam presentes no banco de dados:The following example assumes that the following tables and table-valued function exist in the database:

Object NameObject Name Nomes de colunaColumn Names
DepartamentosDepartments DeptID, DivisionID, DeptName, DeptMgrIDDeptID, DivisionID, DeptName, DeptMgrID
EmpMgrEmpMgr MgrID, EmpIDMgrID, EmpID
funcionáriosEmployees EmpID, EmpLastName, EmpFirstName, EmpSalaryEmpID, EmpLastName, EmpFirstName, EmpSalary
GetReports(MgrID)GetReports(MgrID) EmpID, EmpLastName, EmpSalaryEmpID, EmpLastName, EmpSalary

A função com valor de tabela GetReports retorna a lista de todos os funcionários que se reportam direta ou indiretamente ao MgrID especificado.The GetReports table-valued function, returns the list of all employees that report directly or indirectly to the specified MgrID.

O exemplo usa APPLY para retornar todos os departamentos e todos os funcionários do departamento.The example uses APPLY to return all departments and all employees in that department. Se um departamento em particular não tiver funcionários, não haverá linhas retornadas para ele.If a particular department does not have any employees, there will not be any rows returned for that department.

SELECT DeptID, DeptName, DeptMgrID, EmpID, EmpLastName, EmpSalary  
FROM Departments d    
CROSS APPLY dbo.GetReports(d.DeptMgrID) ;  

Se desejar que a consulta gere linhas para os departamentos sem funcionários, o que irá gerar valores nulos para as colunas EmpID, EmpLastName e EmpSalary, use então OUTER APPLY.If you want the query to produce rows for those departments without employees, which will produce null values for the EmpID, EmpLastName and EmpSalary columns, use OUTER APPLY instead.

SELECT DeptID, DeptName, DeptMgrID, EmpID, EmpLastName, EmpSalary  
FROM Departments d   
OUTER APPLY dbo.GetReports(d.DeptMgrID) ;  

L.L. Usando CROSS APPLYUsing CROSS APPLY

O exemplo a seguir recupera um instantâneo de todos os planos de consulta residindo no cache de plano, consultando a exibição de gerenciamento dinâmico sys.dm_exec_cached_plans para recuperar os identificadores de plano de todas as consultas no cache.The following example retrieves a snapshot of all query plans residing in the plan cache, by querying the sys.dm_exec_cached_plans dynamic management view to retrieve the plan handles of all query plans in the cache. Em seguida, o operador CROSS APPLY é especificado para transmitir o identificador de plano a sys.dm_exec_query_plan.Then the CROSS APPLY operator is specified to pass the plan handles to sys.dm_exec_query_plan. A saída de plano de execução XML de cada plano atualmente no cache de plano está na coluna query_plan da tabela retornada.The XML Showplan output for each plan currently in the plan cache is in the query_plan column of the table that is returned.

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  

M.M. Usando FOR SYSTEM_TIMEUsing FOR SYSTEM_TIME

Aplica-se a: SQL Server 2016 (13.x)SQL Server 2016 (13.x) a SQL Server 2017SQL Server 2017 e Banco de Dados SQLSQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and Banco de Dados SQLSQL Database.

O exemplo a seguir usa o argumento FOR SYSTEM_TIME AS OF date_time_literal_or_variable para retornar linhas da tabela que eram reais (atuais) a partir de 1º de janeiro de 2014.The following example uses the FOR SYSTEM_TIME AS OF date_time_literal_or_variable argument to return table rows that were actual (current) as of January 1, 2014.

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

O exemplo a seguir usa o argumento FOR SYSTEM_TIME FROM date_time_literal_or_variable TO date_time_literal_or_variable para retornar todas as linhas que estavam ativas durante o período definido começando em 1º de janeiro de 2013 e terminando em 1º de janeiro de 2014, excluindo o limite superior.The following example uses the FOR SYSTEM_TIME FROM date_time_literal_or_variable TO date_time_literal_or_variable argument to return all rows that were active during the period defined as starting with January 1, 2013 and ending with January 1, 2014, exclusive of the upper boundary.

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

O exemplo a seguir usa o argumento FOR SYSTEM_TIME BETWEEN date_time_literal_or_variable AND date_time_literal_or_variable para retornar todas as linhas que estavam ativas durante o período definido começando em 1º de janeiro de 2013 e terminando em 1º de janeiro de 2014, incluindo o limite superior.The following example uses the FOR SYSTEM_TIME BETWEEN date_time_literal_or_variable AND date_time_literal_or_variable argument to return all rows that were active during the period defined as starting with January 1, 2013 and ending with January 1, 2014, inclusive of the upper boundary.

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

O exemplo a seguir usa o argumento FOR SYSTEM_TIME CONTAINED IN (date_time_literal_or_variable, date_time_literal_or_variable) para retornar todas as linhas que estavam abertas e fechadas durante o período definido começando em 1º de janeiro de 2013 e terminando em 1º de janeiro de 2014.The following example uses the FOR SYSTEM_TIME CONTAINED IN ( date_time_literal_or_variable, date_time_literal_or_variable ) argument to return all rows that were opened and closed during the period defined as starting with January 1, 2013 and ending with January 1, 2014.

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

O exemplo a seguir usa uma variável em vez de um literal para fornecer os valores de limite de data para a consulta.The following example uses a variable rather than a literal to provide the date boundary values for the query.

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;

Exemplos: Azure SQL Data WarehouseAzure SQL Data Warehouse e Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

N.N. Usando a sintaxe de INNER JOINUsing the INNER JOIN syntax

O exemplo a seguir retorna as colunas SalesOrderNumber, ProductKey e EnglishProductName das tabelas FactInternetSales e DimProduct, em que a chave de junção, ProductKey, é correspondente em ambas as tabelas.The following example returns the SalesOrderNumber, ProductKey, and EnglishProductName columns from the FactInternetSales and DimProduct tables where the join key, ProductKey, matches in both tables. As colunas SalesOrderNumber e EnglishProductName existem em uma das tabelas e, portanto, não é necessário especificar o alias da tabela com essas colunas, conforme mostrado; esses aliases são incluídos para facilitar a leitura.The SalesOrderNumber and EnglishProductName columns each exist in one of the tables only, so it is not necessary to specify the table alias with these columns, as is shown; these aliases are included for readability. A palavra AS antes de um alias de nome não é obrigatória, mas é recomendada para facilitar a leitura e estar em conformidade com o padrão ANSI.The word AS before an alias name is not required but is recommended for readability and to conform to the ANSI standard.

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

Como a palavra-chave INNER não é obrigatória para junções internas, essa mesma consulta pode ser escrita como:Since the INNER keyword is not required for inner joins, this same query could be written as:

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

Uma cláusula WHERE também pode ser usada com essa consulta para limitar os resultados.A WHERE clause could also be used with this query to limit results. Este exemplo limita os resultados a valores SalesOrderNumber maiores que 'SO5000':This example limits results to SalesOrderNumber values higher than '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;  

O.O. Usando a sintaxe de LEFT OUTER JOIN e RIGHT OUTER JOINUsing the LEFT OUTER JOIN and RIGHT OUTER JOIN syntax

O exemplo a seguir une as tabelas FactInternetSales e DimProduct nas colunas ProductKey.The following example joins the FactInternetSales and DimProduct tables on the ProductKey columns. A sintaxe da junção externa esquerda preserva as linhas não correspondentes da tabela à esquerda (FactInternetSales).The left outer join syntax preserves the unmatched rows from the left (FactInternetSales) table. Como a tabela FactInternetSales não contém nenhum valor ProductKey não correspondente na tabela DimProduct, essa consulta retorna as mesmas linhas como o primeiro exemplo de junção interna acima.Since the FactInternetSales table does not contain any ProductKey values that do not match the DimProduct table, this query returns the same rows as the first inner join example above.

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

Essa consulta também pode ser escrita sem a palavra-chave OUTER.This query could also be written without the OUTER keyword.

Em junções externas direitas, as linhas não correspondentes da tabela à direita são preservadas.In right outer joins, the unmatched rows from the right table are preserved. O exemplo a seguir retorna as mesmas linhas que o exemplo de junção externa esquerda acima.The following example returns the same rows as the left outer join example above.

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

A consulta a seguir usa a tabela DimSalesTerritory como a tabela à esquerda em uma junção externa esquerda.The following query uses the DimSalesTerritory table as the left table in a left outer join. Recupera os valores SalesOrderNumber da tabela FactInternetSales.It retrieves the SalesOrderNumber values from the FactInternetSales table. Se não houver nenhuma ordem para determinada SalesTerritoryKey, a consulta retornará um valor NULL para o SalesOrderNumber nessa linha.If there are no orders for a particular SalesTerritoryKey, the query will return a NULL for the SalesOrderNumber for that row. Essa consulta é ordenada pela coluna SalesOrderNumber, de modo que os valores NULL dessa coluna serão exibidos na parte superior dos resultados.This query is ordered by the SalesOrderNumber column, so that any NULLs in this column will appear at the top of the results.

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

Essa consulta pode ser reescrita com uma junção externa direita para recuperar os mesmos resultados:This query could be rewritten with a right outer join to retrieve the same results:

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

P.P. Usando a sintaxe de FULL OUTER JOINUsing the FULL OUTER JOIN syntax

O exemplo a seguir demonstra uma junção externa completa, que retorna todas as linhas de ambas as tabelas unidas, mas retorna NULL para valores não correspondentes da outra tabela.The following example demonstrates a full outer join, which returns all rows from both joined tables but returns NULL for values that do not match from the other table.

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

Essa consulta também pode ser escrita sem a palavra-chave OUTER.This query could also be written without the OUTER keyword.

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

Q.Q. Usando a sintaxe de CROSS JOINUsing the CROSS JOIN syntax

O exemplo a seguir retorna o produto cruzado das tabelas FactInternetSales e DimSalesTerritory.The following example returns the cross-product of the FactInternetSales and DimSalesTerritory tables. Uma lista de todas as combinações possíveis de SalesOrderNumber e SalesTerritoryKey é retornada.A list of all possible combinations of SalesOrderNumber and SalesTerritoryKey are returned. Observe a ausência da cláusula ON da consulta de união cruzada.Notice the absence of the ON clause in the cross join query.

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

R.R. Usando uma tabela derivadaUsing a derived table

O exemplo a seguir usa uma tabela derivada (uma instrução SELECT após a cláusula FROM) para retornar as colunas CustomerKey e LastName de todos os clientes na tabela DimCustomer com valores BirthDate posteriores a 1º de janeiro de 1970 e o sobrenome 'Fernandes'.The following example uses a derived table (a SELECT statement after the FROM clause) to return the CustomerKey and LastName columns of all customers in the DimCustomer table with BirthDate values later than January 1, 1970 and the last name 'Smith'.

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

S.S. Exemplo de dica de junção de REDUCEREDUCE join hint example

O exemplo a seguir usa a dica de junção REDUCE para alterar o processamento da tabela derivada dentro da consulta.The following example uses the REDUCE join hint to alter the processing of the derived table within the query. Ao usar a dica de junção REDUCE nesta consulta, a fis.ProductKey é projetada, replicada e diferenciada e, em seguida, unida ao DimProduct durante a ordem aleatória de DimProduct no ProductKey.When using the REDUCE join hint in this query, the fis.ProductKey is projected, replicated and made distinct, and then joined to DimProduct during the shuffle of DimProduct on ProductKey. A tabela derivada resultante é distribuída em fis.ProductKey.The resulting derived table is distributed on 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;  

T.T. Exemplo de dica de junção de REPLICATEREPLICATE join hint example

Este próximo exemplo mostra a mesma consulta como no exemplo anterior, exceto que uma dica de junção REPLICATE é usada, em vez da dica de junção REDUCE.This next example shows the same query as the previous example, except that a REPLICATE join hint is used instead of the REDUCE join hint. O uso da dica REPLICATE faz com que os valores na coluna ProductKey (de junção) da tabela FactInternetSales sejam replicados para todos os nós.Use of the REPLICATE hint causes the values in the ProductKey (joining) column from the FactInternetSales table to be replicated to all nodes. A tabela DimProduct é unida à versão replicada desses valores.The DimProduct table is joined to the replicated version of those values.

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

U.U. Usando a dica REDISTRIBUTE para assegurar uma movimentação de Ordem Aleatória para uma junção incompatível com a distribuiçãoUsing the REDISTRIBUTE hint to guarantee a Shuffle move for a distribution incompatible join

A consulta a seguir usa a dica de consulta REDISTRIBUTE em uma junção incompatível com a distribuição.The following query uses the REDISTRIBUTE query hint on a distribution incompatible join. Isso garante que o otimizador de consulta usará uma movimentação de Ordem Aleatória no plano de consulta.This guarantees the query optimizer will use a Shuffle move in the query plan. Isso também garante que o plano de consulta não usará uma movimentação de Difusão que move uma tabela distribuída para uma tabela replicada.This also guarantees the query plan will not use a Broadcast move which moves a distributed table to a replicated table.

No exemplo a seguir, a dica REDISTRIBUTE força uma movimentação de Ordem Aleatória na tabela FactInternetSales porque ProductKey é a coluna de distribuição de DimProduct e não é a coluna de distribuição para FactInternetSales.In the following example, the REDISTRIBUTE hint forces a Shuffle move on the FactInternetSales table because ProductKey is the distribution column for DimProduct, and is not the distribution column for FactInternetSales.

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

V.V. Usando TABLESAMPLE para ler dados de uma amostra de linhas em uma tabelaUsing TABLESAMPLE to read data from a sample of rows in a table

O exemplo a seguir usa TABLESAMPLE na cláusula FROM para retornar aproximadamente 10 por cento de todas as linhas na tabela Customer.The following example uses TABLESAMPLE in the FROM clause to return approximately 10 percent of all the rows in the Customer table.

SELECT *  
FROM Sales.Customer TABLESAMPLE SYSTEM (10 PERCENT) ;

Consulte TambémSee Also

CONTAINSTABLE (Transact-SQL) CONTAINSTABLE (Transact-SQL)
FREETEXTTABLE (Transact-SQL) FREETEXTTABLE (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
OPENQUERY (Transact-SQL) OPENQUERY (Transact-SQL)
OPENROWSET (Transact-SQL) OPENROWSET (Transact-SQL)
Operadores (Transact-SQL) Operators (Transact-SQL)
WHERE (Transact-SQL)WHERE (Transact-SQL)