FROM 句と JOIN、APPLY、PIVOT (Transact-SQL)FROM clause plus JOIN, APPLY, PIVOT (Transact-SQL)

適用対象: ○SQL Server (2016 以降) ○Azure SQL Database ○Azure SQL Data Warehouse ○Parallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2016) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Transact-SQL では、FROM 句は次のステートメントで利用できます。In Transact-SQL, the FROM clause is available on the following statements:

FROM 句は通常、SELECT ステートメントで必要です。The FROM clause is usually required on the SELECT statement. 例外は、テーブル列がリストアップされず、リストアップされる唯一の項目がリテラルか、変数か、数式の時です。The exception is when no table columns are listed, and the only items listed are literals or variables or arithmetic expressions.

この記事では、FROM 句で使用できる次のキーワードについても説明します。This article also discusses the following keywords that can be used on the FROM clause:

  • JOINJOIN
  • APPLYAPPLY
  • PIVOTPIVOT

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

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

引数Arguments

<table_source><table_source>
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. 1 つのステートメント内で 256 個までのテーブル ソースを使用できますが、この上限値は、使用可能なメモリとクエリ内の他の式の複雑さに応じて変化します。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. 個別のクエリは、256 個までのテーブル ソースをサポートできません。Individual queries may not support up to 256 table sources.

注意

クエリのパフォーマンスは、クエリで参照される多くのテーブルによって低下する可能性があります。Query performance may suffer with lots of tables referenced in a query. コンパイルと最適化にかかる時間も、追加の要素によって影響を受けます。Compilation and optimization time is also affected by additional factors. これらの要素には、各 <table_source> 上のインデックスとインデックス付きビューの存在、および SELECT ステートメント内の <select_list> のサイズが含まれます。These include the presence of indexes and indexed views on each <table_source> and the size of the <select_list> in the SELECT statement.

FROM キーワードの後のテーブル ソースの順序は、返される結果セットには影響しません。The order of table sources after the FROM keyword does not affect the result set that is returned. FROM 句内に重複した名前を指定すると、SQL ServerSQL Server はエラーを返します。SQL ServerSQL Server returns errors when duplicate names appear in the FROM clause.

table_or_view_nametable_or_view_name
テーブルまたはビューの名前です。Is the name of a table or view.

SQL ServerSQL Server の同じインスタンス上の別のデータベース内にテーブルまたはビューが存在する場合は、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.

テーブルまたはビューが SQL ServerSQL Server インスタンスの外部に存在する場合は、linked_server.catalog.schema.object という形式の 4 部構成の名前を使用します。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. 詳細については、「 sp_addlinkedserver (Transact-SQL)からデータにアクセスする方法について説明します。For more information, see sp_addlinkedserver (Transact-SQL). 名前の中のサーバー部分として OPENDATASOURCE 関数を使用して構成される 4 部構成の名前は、リモート テーブル ソースを指定するためにも使用できます。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. OPENDATASOURCE を指定した場合は、database_name および schema_name がすべてのデータ ソースに適用されるとは限らず、リモート オブジェクトにアクセスする OLE DB プロバイダーの機能により制限されます。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
table_source の別名です。別名は、便宜上、または自己結合やサブクエリでテーブルまたはビューを区別するために使用できます。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. 別名にはテーブル名を短縮したものが指定されることが多く、結合されたテーブルの特定の列を参照するために使用されます。An alias is frequently a shortened table name used to refer to specific columns of the tables in a join. 結合された複数のテーブルに同じ列名が存在する場合、SQL ServerSQL Server では、テーブル名、ビュー名、または別名で列名を修飾する必要があります。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. 別名が定義されている場合、テーブル名は使用できません。The table name cannot be used if an alias is defined.

派生テーブル、行セット、またはテーブル値関数、または演算子句 (PIVOT や UNPIVOT など) が使用されている場合、句の末尾に必要な table_alias は、グループ化列を含む、すべての返された列の関連テーブル名になります。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> )
クエリ オプティマイザーが、このテーブルを使用して、このステートメントに対し最適化またはロックを使用することを指定します。Specifies that the query optimizer use an optimization or locking strategy with this table and for this statement. 詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。For more information, see Table Hints (Transact-SQL).

rowset_functionrowset_function

適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017 および SQL データベースSQL DatabaseApplies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017 and SQL データベースSQL Database.

OPENROWSET など、テーブル参照の代わりに使用できるオブジェクトを返す行セット関数のいずれかを指定します。Specifies one of the rowset functions, such as OPENROWSET, that returns an object that can be used instead of a table reference. 行セット関数の一覧の詳細については、「行セット関数 (Transact-SQL)」を参照してください。For more information about a list of rowset functions, see Rowset Functions (Transact-SQL).

OPENROWSET 関数および OPENQUERY 関数を使用したリモート オブジェクトの指定は、そのオブジェクトにアクセスする OLE DB プロバイダーの機能に依存します。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

適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017 および SQL データベースSQL DatabaseApplies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017 and SQL データベースSQL Database.

結果セット内の列名に対する別名です。このパラメーターは省略可能です。Is an optional alias to replace a column name in the result set. 列の別名は、BULK オプションが指定された OPENROWSET 関数を使用する SELECT ステートメント内でのみ使用できます。Column aliases are allowed only in SELECT statements that use the OPENROWSET function with the BULK option. bulk_column_alias を使用する場合は、ファイル内の列と同じ順序ですべてのテーブル列に対して別名を指定します。When you use bulk_column_alias, specify an alias for every table column in the same order as the columns in the file.

注意

この別名は、XML 形式のファイルの COLUMN 要素内に NAME 属性が存在する場合は、それをオーバーライドします。This alias overrides the NAME attribute in the COLUMN elements of an XML format file, if present.

user_defined_functionuser_defined_function
テーブル値関数を指定します。Specifies a table-valued function.

OPENXML <openxml_clause>OPENXML <openxml_clause>

適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017 および SQL データベースSQL DatabaseApplies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017 and SQL データベースSQL Database.

XML ドキュメントに対して行セット ビューを提供します。Provides a rowset view over an XML document. 詳細については、「OPENXML (Transact-SQL)」を参照してください。For more information, see OPENXML (Transact-SQL).

derived_tablederived_table
データベースから行を取得するサブクエリです。Is a subquery that retrieves rows from the database. derived_table は 1 つ上のレベルのクエリへの入力として使用されます。derived_table is used as input to the outer query.

derived _table では、Transact-SQLTransact-SQL テーブル値コンストラクター機能を使用して、複数の行を指定できます。derived _table can use the Transact-SQLTransact-SQL table value constructor feature to specify multiple rows. たとえば、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);. 詳細については、「テーブル値コンストラクター (Transact-SQL)」を参照してください。For more information, see Table Value Constructor (Transact-SQL).

column_aliascolumn_alias
派生テーブルの結果セット内の列名に対する別名です。このパラメーターは省略可能です。Is an optional alias to replace a column name in the result set of the derived table. 選択リストの各列の別名を 1 つずつ含みます。列の別名リスト全体をかっこで囲みます。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>

適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017 および SQL データベースSQL DatabaseApplies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL データベースSQL Database.

データの特定のバージョンが、指定された時間的なテーブルとそのシステムのバージョン情報のリンクの履歴テーブルから返されることを指定しますSpecifies that a specific version of data is returned from the specified temporal table and its linked system-versioned history table

TABLESAMPLE 句Tablesample clause

適用対象: SQL Server、SQL DatabaseApplies to: SQL Server, SQL Database

テーブルからのデータのサンプルが返されることを指定します。Specifies that a sample of data from the table is returned. サンプルは、概数になる可能性があります。The sample may be approximate. この句は、SELECT または UPDATE ステートメント内の主テーブルまたは結合テーブルで使用できます。This clause can be used on any primary or joined table in a SELECT or UPDATE statement. TABLESAMPLE はビューを使用して指定できません。TABLESAMPLE cannot be specified with views.

注意

SQL ServerSQL Server にアップグレードされたデータベースに対して TABLESAMPLE を使用するときは、データベースの互換性レベルは 110 以上に設定され、再帰共通テーブル式 (CTE) クエリでは PIVOT は許可されません。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. 詳細については、「ALTER DATABASE 互換性レベル (Transact-SQL)」を参照してください。For more information, see ALTER DATABASE Compatibility Level (Transact-SQL).

SYSTEMSYSTEM
ISO 標準で指定された、実装に依存するサンプリング方法です。Is an implementation-dependent sampling method specified by ISO standards. SQL ServerSQL Server では、これが唯一のサンプリング方法であり、既定で適用されます。In SQL ServerSQL Server, this is the only sampling method available and is applied by default. SYSTEM は、サンプルとしてテーブルからページがランダムに選択され、それらのページのすべての行がサンプル サブセットとして返される、ページ ベースのサンプリング方法を適用します。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
行数または行数に対応する割合を表す真数または概数値の定数値式です。Is an exact or approximate constant numeric expression that represents the percent or number of rows. PERCENT を使用して指定されている場合、sample_number は、暗黙的に float 値に変換されます。それ以外の場合は bigint に変換されます。When specified with PERCENT, sample_number is implicitly converted to a float value; otherwise, it is converted to bigint. PERCENT は既定値です。PERCENT is the default.

PERCENTPERCENT
sample_number で指定した割合の行がテーブルから取得されることを指定します。Specifies that a sample_number percent of the rows of the table should be retrieved from the table. PERCENT が指定されている場合、SQL ServerSQL Server は指定された割合の概数を返します。When PERCENT is specified, SQL ServerSQL Server returns an approximate of the percent specified. PERCENT が指定されている場合、sample_number 式は、0 ~ 100 の値に評価する必要があります。When PERCENT is specified the sample_number expression must evaluate to a value from 0 to 100.

ROWSROWS
sample_number に指定した概数の行が取得されることを指定します。Specifies that approximately sample_number of rows will be retrieved. ROWS が指定されている場合、SQL ServerSQL Server は指定した行数の概数を返します。When ROWS is specified, SQL ServerSQL Server returns an approximation of the number of rows specified. ROWS が指定されている場合、sample_number 式は、0 より大きい整数値に評価される必要があります。When ROWS is specified, the sample_number expression must evaluate to an integer value greater than zero.

REPEATABLEREPEATABLE
選択されたサンプルを再度返すことができることを示します。Indicates that the selected sample can be returned again. 同じ repeat_seed 値を使用して指定されている場合、SQL ServerSQL Server はテーブル内の行に変更が行われない限り同じ行のサブセットを返します。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. 異なる repeat_seed 値を使用して指定されている場合、SQL ServerSQL Server は、テーブル内の異なる行のサンプルをいくつか返す可能性があります。When specified with a different repeat_seed value, SQL ServerSQL Server will likely return some different sample of the rows in the table. テーブルに対する挿入、更新、削除、インデックスの再構築またはデフラグ、およびデータベースの復元またはアタッチは、変更と見なされます。The following actions to the table are considered changes: insert, update, delete, index rebuild or defragmentation, and database restore or attach.

repeat_seedrepeat_seed
乱数を生成するために SQL ServerSQL Server によって使用される整数の定数式です。Is a constant integer expression used by SQL ServerSQL Server to generate a random number. repeat_seedbigintです。repeat_seed is bigint. repeat_seed が指定されていない場合は、SQL ServerSQL Server によってランダムに値が割り当てられます。If repeat_seed is not specified, SQL ServerSQL Server assigns a value at random. テーブルに変更が適用されていない場合は、特定の repeat_seed 値に対して、サンプル結果は常に同じになります。For a specific repeat_seed value, the sampling result is always the same if no changes have been applied to the table. repeat_seed 式は、0 より大きい整数値に評価される必要があります。The repeat_seed expression must evaluate to an integer greater than zero.

TABLESAMPLE 句Tablesample clause

適用対象: SQL Data WarehouseApplies to: SQL Data Warehouse

テーブルからのデータのサンプルが返されることを指定します。Specifies that a sample of data from the table is returned. サンプルは、概数になる可能性があります。The sample may be approximate. この句は、SELECT または UPDATE ステートメント内の主テーブルまたは結合テーブルで使用できます。This clause can be used on any primary or joined table in a SELECT or UPDATE statement. TABLESAMPLE はビューを使用して指定できません。TABLESAMPLE cannot be specified with views.

PERCENTPERCENT
sample_number で指定した割合の行がテーブルから取得されることを指定します。Specifies that a sample_number percent of the rows of the table should be retrieved from the table. PERCENT を指定すると、SQL Data Warehouse は指定された割合の概数を返します。When PERCENT is specified, SQL Data Warehouse returns an approximate of the percent specified. PERCENT を指定する場合、sample_number 式は 0 ~ 100 の値に評価される必要があります。When PERCENT is specified, the sample_number expression must evaluate to a value from 0 to 100.

結合テーブルJoined table

結合テーブルは、2 つ以上のテーブルの積である結果セットです。A joined table is a result set that is the product of two or more tables. 複数の結合については、かっこを使って結合の順序を変更できます。For multiple joins, use parentheses to change the natural order of the joins.

[結合の種類]Join type

結合操作の種類を指定します。Specifies the type of join operation.

INNERINNER
一致するすべての行をペアで返すことを指定します。Specifies all matching pairs of rows are returned. 両方のテーブルで一致しない行は廃棄します。Discards unmatched rows from both tables. 結合の種類が指定されていない場合は、これが既定値になります。When no join type is specified, this is the default.

FULL [ OUTER ]FULL [ OUTER ]
結合条件に合わない左側または右側のテーブルの行も結果セットに含まれ、他方のテーブルに対応する出力列は 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. この処理は、INNER JOIN によって通常返される行も含めて、すべての行を返します。This is in addition to all rows typically returned by the INNER JOIN.

LEFT [ OUTER ]LEFT [ OUTER ]
内部結合によって返されるすべての行に加えて、結合条件に合わない左側のテーブルのすべての行も結果セットに含まれます。右側のテーブルからの出力列は NULL に設定されることを指定します。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]
内部結合によって返されるすべての行に加えて、結合条件に合わない右側のテーブルのすべての行も結果セットに含まれます。左側のテーブルからの出力列は NULL に設定されることを指定します。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.

結合ヒントJoin hint

SQL ServerSQL Server および SQL DatabaseSQL Database の場合、SQL ServerSQL Server クエリ オプティマイザーが、クエリの FROM 句で指定される結合ごとに、1 つの結合ヒントまたは実行アルゴリズムを使用することを指定します。For SQL ServerSQL Server and SQL DatabaseSQL Database, specifies that the SQL ServerSQL Server query optimizer use one join hint, or execution algorithm, per join specified in the query FROM clause. 詳細については、「結合ヒント (Transact-SQL)」を参照してください。For more information, see Join Hints (Transact-SQL).

SQL データ ウェアハウスSQL Data Warehouse および Parallel Data WarehouseParallel Data Warehouse の場合、これらの結合ヒントは、2 つの配布互換性のない列での内部結合に適用されます。For SQL データ ウェアハウスSQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse, these join hints apply to INNER joins on two distribution incompatible columns. これらは、クエリの処理中に発生するデータの移動量を制限することで、クエリのパフォーマンスを向上することができます。They can improve query performance by restricting the amount of data movement that occurs during query processing. SQL データ ウェアハウスSQL Data Warehouse および Parallel Data WarehouseParallel Data Warehouse の許容される結合ヒントは次のとおりです。The allowable join hints for SQL データ ウェアハウスSQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse are as follows:

REDUCEREDUCE
2 つの配布互換性のないテーブルを互換にするため、結合の右側にあるテーブルに移動する行の数を減らします。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. REDUCE ヒントは、semi-join ヒントとも呼ばれます。The REDUCE hint is also called a semi-join hint.

REPLICATEREPLICATE
結合の左側にあるテーブルの結合する列にある値を、すべてのノードにレプリケートされるようにします。Causes the values in the joining column from the table on the left side of the join to be replicated to all nodes. 右側のテーブルは、これらの列のレプリケートされたバージョンに結合されます。The table on the right is joined to the replicated version of those columns.

REDISTRIBUTEREDISTRIBUTE
2 つのデータ ソースの、JOIN 句で指定された列への配布を強制します。Forces two data sources to be distributed on columns specified in the JOIN clause. 配布されたテーブルに対し、Parallel Data WarehouseParallel Data Warehouse では SHUFFLE_MOVE が実行されます。For a distributed table, Parallel Data WarehouseParallel Data Warehouse will perform a shuffle move. レプリケートされたテーブルに対し、Parallel Data WarehouseParallel Data Warehouse では TRIM_MOVE が実行されます。For a replicated table, Parallel Data WarehouseParallel Data Warehouse will perform a trim move. これらの移動の種類を理解するには、Parallel Data Warehouse 製品ドキュメントParallel Data Warehouse product documentation にある「Understanding Query Plans」 (クエリ プランについて) トピックの「DMS Query Plan Operations」 (DMS クエリ プランの操作) セクションを参照してください。To understand these move types, see the "DMS Query Plan Operations" section in the "Understanding Query Plans" topic in the Parallel Data Warehouse 製品ドキュメントParallel Data Warehouse product documentation. このヒントは、クエリ プランで BROADCAST_MOVE を使用して配布互換性のない結合を解決する際のパフォーマンスを向上させることができます。This hint can improve performance when the query plan is using a broadcast move to resolve a distribution incompatible join.

JOINJOIN
指定されたテーブル ソースまたはビューの間で、指定された結合操作が行われることを指定します。Indicates that the specified join operation should occur between the specified table sources or views.

ON <search_condition>ON <search_condition>
結合するときの条件を指定します。Specifies the condition on which the join is based. 列と比較演算子はよく使用されますが、条件で任意の結合述語を指定できます。たとえば、次のようになります。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);  
  

列に結合条件を指定する場合、使用される列は、同じ列名、同じデータ型である必要はありません。ただし、データ型が異なる場合は、互換性のあるデータ型であるか、SQL ServerSQL Server が暗黙的に変換できるデータ型である必要があります。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. データ型が暗黙的に変換されない場合は、CONVERT 関数を使用して明示的に変換する必要があります。If the data types cannot be implicitly converted, the condition must explicitly convert the data type by using the CONVERT function.

ON 句に、結合されるテーブルのいずれかだけを指定している述語がある場合があります。There can be predicates that involve only one of the joined tables in the ON clause. このような述語は、クエリの WHERE 句にもある場合があります。Such predicates also can be in the WHERE clause in the query. このように述語を指定した場合、INNER 結合に対しては同じ結果になりますが、OUTER 結合が関係するときは結果が異なることがあります。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. ON 句内の述語は結合の前にテーブルに適用されるのに対し、WHERE 句は意味的に結合結果に適用されるためです。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.

検索条件および述語の詳細については、「検索条件 (Transact-SQL)」を参照してください。For more information about search conditions and predicates, see Search Condition (Transact-SQL).

CROSS JOINCROSS JOIN
2 つのテーブルの結合を指定します。Specifies the cross-product of two tables. SQL-92 形式でない旧形式の結合で WHERE 句が指定されていない場合と同じ行が返されます。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
APPLY 演算子の right_table_sourceleft_table_source の各行に対して評価することを指定します。Specifies that the right_table_source of the APPLY operator is evaluated against every row of the left_table_source. この機能は、right_table_source に、引数として left_table_source から列の値を取得するテーブル値関数が含まれる場合に役立ちます。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.

CROSS または OUTER は、APPLY を使用して指定する必要があります。Either CROSS or OUTER must be specified with APPLY. CROSS を指定した場合は、left_table_source の指定行に対して right_table_source を評価し、空の結果セットが返されると、行は生成されません。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.

OUTER を指定した場合は、left_table_source の各行に対して right_table_source を評価し、空の結果セットが返されても、各行に対して 1 行が生成されます。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.

詳細については、「解説」を参照してください。For more information, see the Remarks section.

left_table_sourceleft_table_source
前の引数で定義されたテーブル ソースです。Is a table source as defined in the previous argument. 詳細については、「解説」を参照してください。For more information, see the Remarks section.

right_table_sourceright_table_source
前の引数で定義されたテーブル ソースです。Is a table source as defined in the previous argument. 詳細については、「解説」を参照してください。For more information, see the Remarks section.

PIVOT 句PIVOT clause

table_source PIVOT <pivot_clause>table_source PIVOT <pivot_clause>
table_sourcepivot_column に基づいてピボットされることを指定します。Specifies that the table_source is pivoted based on the pivot_column. table_source はテーブルまたはテーブル式です。table_source is a table or table expression. 出力は、pivot_column および value_column 以外の table_source のすべての列を含んでいるテーブルです。The output is a table that contains all columns of the table_source except the pivot_column and value_column. pivot_column および value_column 以外の table_source の列は、ピボット演算子のグループ化列と呼ばれます。The columns of the table_source, except the pivot_column and value_column, are called the grouping columns of the pivot operator. PIVOT および UNPIVOT の詳細については、「PIVOT および UNPIVOT の使用」を参照してください。For more information about PIVOT and UNPIVOT, see Using PIVOT and UNPIVOT.

PIVOT は、グループ化列に関する入力テーブルに対してグループ化の操作を実行し、グループごとに 1 行のデータを返します。PIVOT performs a grouping operation on the input table with regard to the grouping columns and returns one row for each group. さらに、出力では、input_tablepivot_column に表示される column_list で指定された値ごとに 1 列のデータが含まれます。Additionally, the output contains one column for each value specified in the column_list that appears in the pivot_column of the input_table.

詳細については、後の「解説」を参照してください。For more information, see the Remarks section that follows.

aggregate_functionaggregate_function
システムまたはユーザー定義の集計関数で、1 つ以上の入力を受け取ります。Is a system or user-defined aggregate function that accepts one or more inputs. 集計関数は、NULL 値に固定されます。The aggregate function should be invariant to null values. NULL 値に固定された集計関数は、集計値を評価する際に、グループ内の NULL 値を考慮しません。An aggregate function invariant to null values does not consider null values in the group while it is evaluating the aggregate value.

COUNT(*) システム集計関数は使用できません。The COUNT(*) system aggregate function is not allowed.

value_columnvalue_column
PIVOT 演算子の値列です。Is the value column of the PIVOT operator. UNPIVOT と共に使用される場合、value_column は、入力 table_source 内の既存の列の名前にすることはできません。When used with UNPIVOT, value_column cannot be the name of an existing column in the input table_source.

FOR pivot_columnFOR pivot_column
PIVOT 演算子のピボット列です。Is the pivot column of the PIVOT operator. pivot_column は、暗黙的または明示的に nvarchar() 型に変換できる型である必要があります。pivot_column must be of a type implicitly or explicitly convertible to nvarchar(). この列は image または rowversion にすることはできません。This column cannot be image or rowversion.

UNPIVOT が使用される場合、pivot_column は、table_source から絞り込まれる出力列の名前です。When UNPIVOT is used, pivot_column is the name of the output column that becomes narrowed from the table_source. table_source 内に、この名前が付けられている既存の列がないことが条件となります。There cannot be an existing column in table_source with that name.

IN (column_list )IN (column_list )
PIVOT 句で使用する場合は、出力テーブルの列名になる pivot_column の値の一覧を指定します。In the PIVOT clause, lists the values in the pivot_column that will become the column names of the output table. この一覧では、ピボットの対象となっている入力 table_source 内に既に存在している列名は指定できません。The list cannot specify any column names that already exist in the input table_source that is being pivoted.

UNPIVOT 句で使用する場合は、単一の pivot_column に絞り込まれる table_source 内の列の一覧を指定します。In the UNPIVOT clause, lists the columns in table_source that will be narrowed into a single pivot_column.

table_aliastable_alias
出力テーブルの別名です。Is the alias name of the output table. pivot_table_alias を指定する必要があります。pivot_table_alias must be specified.

UNPIVOT <unpivot_clause>UNPIVOT <unpivot_clause>
入力テーブルが column_list 内の複数の列から pivot_column と呼ばれる単一の列に絞り込まれることを指定します。Specifies that the input table is narrowed from multiple columns in column_list into a single column called pivot_column. PIVOT および UNPIVOT の詳細については、「PIVOT および UNPIVOT の使用」を参照してください。For more information about PIVOT and UNPIVOT, see Using PIVOT and UNPIVOT.

AS OF <date_time>AS OF <date_time>

適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017 および SQL データベースSQL DatabaseApplies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL データベースSQL Database.

これまでの時間内には、指定位置で行ごとに実際の値を含む (現在) の 1 つのレコードを含むテーブルを返します。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. 内部的には、テンポラル テーブルとその履歴テーブルの結合が行われ、結果がフィルター処理されて、 <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. system_start_time_column_name 値が <date_time> パラメーター値と等しいかそれよりも小さく、system_end_time_column_name 値が <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>

適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017 および SQL データベースSQL DatabaseApplies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL データベースSQL Database.

指定した時間範囲内でアクティブだったすべての行バージョンの値を含むテーブルを返します。FROM 引数の <start_date_time> パラメーター値の前にアクティブになったか、TO 引数の <end_date_time> パラメーター値の後にアクティブでなくなったかに無関係です。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. 内部的には、共用体が一時的なテーブルとその履歴テーブルの間実行され、結果をフィルター処理すると、指定した時間範囲の中にいつでもにアクティブだったすべての行のバージョンの値を返します。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. FROM エンドポイントによって定義されている下限の境界で正確にアクティブになった行のサイズが含まれ、宛先エンドポイントによって定義された境界の上限で正確にアクティブになった行は含まれません。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>

適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017 および SQL データベースSQL DatabaseApplies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL データベースSQL Database.

<end_date_time> エンドポイントで定義された上限の境界によってアクティブになった行が含まれることを除き、上記の FROM <start_date_time> TO <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>)

適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017 および SQL データベースSQL DatabaseApplies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL データベースSQL Database.

開かれて、CONTAINED IN 引数の 2 つの datetime 値で定義されている指定時間範囲内に閉じられた、すべてのレコードのバージョンの値が含まれるテーブルを返します。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. 行が下位の境界に正確に有効になったまたは上限の境界上だけでアクティブにされているが中断されることでは、含まれています。Rows that became active exactly on the lower boundary or ceased being active exactly on the upper boundary are included.

ALLALL
現在のテーブルと、履歴テーブルの両方からのすべての行から値を持つテーブルを返します。Returns a table with the values from all rows from both the current table and the history table.

RemarksRemarks

FROM 句は、結合テーブルと派生テーブルに対して SQL-92-SQL 構文がサポートされています。The FROM clause supports the SQL-92-SQL syntax for joined tables and derived tables. SQL-92 構文には、INNER、LEFT OUTER、RIGHT OUTER、FULL OUTER、および CROSS 結合演算子が用意されています。SQL-92 syntax provides the INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER, and CROSS join operators.

FROM 句内での UNION と JOIN は、ビュー内で、および派生テーブルやサブクエリ内でサポートされています。UNION and JOIN within a FROM clause are supported within views and in derived tables and subqueries.

自己結合は、そのテーブル自体に対して結合されるテーブルです。A self-join is a table that is joined to itself. 自己結合に基づいた挿入または更新の操作は、FROM 句の順序に従います。Insert or update operations that are based on a self-join follow the order in the FROM clause.

SQL ServerSQL Server は列の分布統計を提供するリンク サーバーからの分布統計および基数統計を検討するので、REMOTE 結合ヒントを使用して結合をリモートから評価する必要はありません。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. SQL ServerSQL Server クエリ プロセッサはリモートの統計量を検討し、リモート結合の方法が適切かどうかを決定します。The SQL ServerSQL Server query processor considers remote statistics and determines whether a remote-join strategy is appropriate. REMOTE 結合ヒントは、列の分布統計を提供しないプロバイダーに対しては便利です。REMOTE join hint is useful for providers that do not provide column distribution statistics.

APPLY の使用Using APPLY

APPLY 演算子の左右両方のオペランドはテーブル式です。Both the left and right operands of the APPLY operator are table expressions. これらのオペランドの主な相違点は、right_table_source は関数の引数として left_table_source から列を取得するテーブル値関数を使用できるということです。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. left_table_source には、テーブル値関数を含めることができますが、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.

APPLY 演算子は、FROM 句のテーブル ソースを作成するために、次の方法で動作します。The APPLY operator works in the following way to produce the table source for the FROM clause:

  1. left_table_source の各行に対して right_table_source を評価し、行セットを作成します。Evaluates right_table_source against each row of the left_table_source to produce rowsets.

    right_table_source の値は left_table_source に依存します。The values in the right_table_source depend on left_table_source. right_table_source はほぼ TVF(left_table_source.row) の方式で表記できます (TVF はテーブル値関数)。right_table_source can be represented approximately this way: TVF(left_table_source.row), where TVF is a table-valued function.

  2. UNION ALL 操作を実行し、right_table_source の評価の各行に対して作成された結果セットを left_table_source に結合します。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.

    APPLY 演算子の結果として作成される列の一覧は、right_table_source からの列の一覧と結合された left_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.

PIVOT および UNPIVOT の使用Using PIVOT and UNPIVOT

pivot_column および value_column は、PIVOT 演算子によって使用されるグループ化列です。The pivot_column and value_column are grouping columns that are used by the PIVOT operator. PIVOT は、次のプロセスに従って出力結果セットを取得します。PIVOT follows the following process to obtain the output result set:

  1. グループ化列に対して input_table 上で GROUP BY を実行し、各グループに対して 1 行の出力行を作成します。Performs a GROUP BY on its input_table against the grouping columns and produces one output row for each group.

    出力行内のグループ化列は、input_table 内の該当するグループに対応する列の値を取得します。The grouping columns in the output row obtain the corresponding column values for that group in the input_table.

  2. 次の処理を実行して、各出力行の列の一覧内の列に対して値を生成します。Generates values for the columns in the column list for each output row by performing the following:

    1. pivot_column に対して前の手順の GROUP BY で生成された行をさらにグループ化します。Grouping additionally the rows generated in the GROUP BY in the previous step against the pivot_column.

      column_list 内の各出力列に対して、次の条件を満たすサブグループを選択します。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 は、このサブグループ上の value_column に対して評価され、その結果は対応する output_column の値として返されます。aggregate_function is evaluated against the value_column on this subgroup and its result is returned as the value of the corresponding output_column. サブグループが空である場合は、SQL ServerSQL Server は、その output_column に対して null 値を生成します。If the subgroup is empty, SQL ServerSQL Server generates a null value for that output_column. 集計関数が COUNT であり、サブグループが空である場合は、0 が返されます。If the aggregate function is COUNT and the subgroup is empty, zero (0) is returned.

注意

UNPIVOT 句内の列識別子は、カタログ照合順序に従います。The column identifiers in the UNPIVOT clause follow the catalog collation. SQL DatabaseSQL Database の場合、照合順序は常に SQL_Latin1_General_CP1_CI_AS です。For SQL DatabaseSQL Database, the collation is always SQL_Latin1_General_CP1_CI_AS. SQL ServerSQL Server の部分的包含データベースの場合、照合順序は常に 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. 列が他の列と結合されている場合、競合を回避するために COLLATE 句 (COLLATE DATABASE_DEFAULT) が必要です。If the column is combined with other columns, then a collate clause (COLLATE DATABASE_DEFAULT) is required to avoid conflicts.

詳細については、PIVOT および UNPIVOT の例を含む、「PIVOT および UNPIVOT の使用」を参照してください。For more information about PIVOT and UNPIVOT including examples, see Using PIVOT and UNPIVOT.

アクセス許可Permissions

DELETE、SELECT、または UPDATE ステートメントに対する権限が必要です。Requires the permissions for the DELETE, SELECT, or UPDATE statement.

使用例Examples

A.A. 単純な FROM 句を使用するUsing a simple FROM clause

次の例では、AdventureWorks2012AdventureWorks2012 サンプル データベース内の TerritoryID テーブルから Name および SalesTerritory 列を取得します。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 ;  

以下に結果セットを示します。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. TABLOCK および HOLDLOCK オプティマイザー ヒントを使用するUsing the TABLOCK and HOLDLOCK optimizer hints

次の部分的なトランザクションでは、明示的な共有テーブル ロックを Employee に設定する方法と、インデックスを読み取る方法を示します。The following partial transaction shows how to place an explicit shared table lock on Employee and how to read the index. ロックはトランザクション全体をとおして保持されます。The lock is held throughout the whole transaction.

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

C.C. SQL-92 CROSS JOIN 構文を使用するUsing the SQL-92 CROSS JOIN syntax

次の例は、AdventureWorks2012AdventureWorks2012 データベース内の 2 つのテーブル EmployeeDepartment がクロスした結果を返します。The following example returns the cross product of the two tables Employee and Department in the AdventureWorks2012AdventureWorks2012 database. BusinessEntityID 行とすべての Department の名前の行を組み合わせた場合に、作成される可能性があるすべての組み合わせの一覧が返されます。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. SQL-92 FULL OUTER JOIN 構文を使用するUsing the SQL-92 FULL OUTER JOIN syntax

次の例は、AdventureWorks2012AdventureWorks2012 データベース内の SalesOrderDetail テーブル内の製品名、および対応する販売注文を返します。The following example returns the product name and any corresponding sales orders in the SalesOrderDetail table in the AdventureWorks2012AdventureWorks2012 database. また、Product テーブル内に製品が一覧表示されていない販売注文、および 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. SQL-92 LEFT OUTER JOIN 構文を使用するUsing the SQL-92 LEFT OUTER JOIN syntax

次の例では、ProductID の 2 つのテーブルを結合し、左側のテーブルから一致しない行を取り出します。The following example joins two tables on ProductID and preserves the unmatched rows from the left table. Product テーブルは、各テーブル内の SalesOrderDetail 列について ProductID テーブルと照合されます。The Product table is matched with the SalesOrderDetail table on the ProductID columns in each table. 注文されたかどうかにかかわらず、すべての製品が結果セットに表示されます。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. SQL-92 INNER JOIN 構文を使用するUsing the SQL-92 INNER JOIN syntax

次の例では、すべての製品名と販売注文 ID を返します。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. SQL-92 RIGHT OUTER JOIN 構文を使用するUsing the SQL-92 RIGHT OUTER JOIN syntax

次の例では、TerritoryID の 2 つのテーブルを結合し、右側のテーブルから一致しない行を取り出します。The following example joins two tables on TerritoryID and preserves the unmatched rows from the right table. SalesTerritory テーブルは、各テーブル内の TerritoryID 列について SalesPerson テーブルと照合されます。The SalesTerritory table is matched with the SalesPerson table on the TerritoryID column in each table. 販売区域に割り当てられているかどうかに関係なく、すべての販売員は結果セットに表示されます。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. HASH および MERGE 結合ヒントを使用するUsing HASH and MERGE join hints

次の例では、ProductProductVendor、および Vendor テーブルの 3 つのテーブル結合を実行して、製品とその仕入先の一覧を作成します。The following example performs a three-table join among the Product, ProductVendor, and Vendor tables to produce a list of products and their vendors. クエリ オプティマイザーは、MERGE 結合を使用して ProductProductVendor (ppv) を結合します。The query optimizer joins Product and ProductVendor (p and pv) by using a MERGE join. 次に、ProductProductVendor の MERGE 結合の結果が (ppv)、Vendor テーブルに対して HASH 結合され、(ppv) と 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.

重要

結合ヒントを指定すると、INNER キーワードを省略することはできません。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. 派生テーブルを使用するUsing a derived table

次の例では、派生テーブル、つまり SELECT 句の後に FROM ステートメントを使用することで、すべての従業員の姓と名、およびそれぞれの住所のある都市を返します。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. TABLESAMPLE を使用してテーブル内のサンプル行からデータを読み取るUsing TABLESAMPLE to read data from a sample of rows in a table

次の例では、TABLESAMPLE 句内で FROM を使用して、10 テーブル内にあるすべての行の約 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. APPLY の使用Using APPLY

次の例では、次のテーブルとテーブル値関数がデータベース内に存在することを前提としています。The following example assumes that the following tables and table-valued function exist in the database:

[オブジェクト名]Object Name [列名]Column Names
DepartmentsDepartments DeptID、DivisionID、DeptName、DeptMgrIDDeptID, DivisionID, DeptName, DeptMgrID
EmpMgrEmpMgr MgrID、EmpIDMgrID, EmpID
EmployeesEmployees EmpID、EmpLastName、EmpFirstName、EmpSalaryEmpID, EmpLastName, EmpFirstName, EmpSalary
GetReports(MgrID)GetReports(MgrID) EmpID、EmpLastName、EmpSalaryEmpID, EmpLastName, EmpSalary

指定された MgrID の直接または間接の監督下にあるすべての従業員の一覧を返す、GetReports テーブル値関数。The GetReports table-valued function, returns the list of all employees that report directly or indirectly to the specified MgrID.

この例では、APPLY を使用して、すべての部門と、各部門内のすべての従業員を返します。The example uses APPLY to return all departments and all employees in that department. 特定の部門に従業員が存在しない場合は、その部門には行が返されません。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) ;  

EmpIDEmpLastName、および EmpSalary 列に対して NULL 値を作成する、従業員が存在しない部門に対してもクエリによって行を作成する場合は、代わりに 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. CROSS APPLY を使用するUsing CROSS APPLY

次の例では、sys.dm_exec_cached_plans 動的管理ビューに対してクエリを実行し、キャッシュにあるすべてのクエリ プランのプラン ハンドルを取得することによって、プラン キャッシュにあるすべてのクエリ プランのスナップショットを取得します。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. これにより、プラン ハンドルを sys.dm_exec_query_plan に渡すように CROSS APPLY 演算子が指定されます。Then the CROSS APPLY operator is specified to pass the plan handles to sys.dm_exec_query_plan. 現在プラン キャッシュにある各プランの XML プラン表示の出力は、返されるテーブルの query_plan 列に格納されます。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. FOR SYSTEM_TIME を使用するUsing FOR SYSTEM_TIME

適用対象: SQL Server 2016 (13.x)SQL Server 2016 (13.x) から SQL Server 2017SQL Server 2017 および SQL データベースSQL DatabaseApplies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL データベースSQL Database.

次の例では、FOR SYSTEM_TIME AS OF date_time_literal_or_variable 引数を使用して、2014 年 1 月 1 日の時点の実際 (現在) のテーブル行を返します。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;

次の例では、FOR SYSTEM_TIME FROM date_time_literal_or_variable TO date_time_literal_or_variable 引数を使用して、境界の上限を除く、定義された期間 (2013 年 1 月 1 日から 2014 年 1 月 1 日まで) にアクティブだったすべての行を返します。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;

次の例では、FOR SYSTEM_TIME BETWEEN date_time_literal_or_variable AND date_time_literal_or_variable 引数を使用して、境界の上限を含む、定義された期間 (2013 年 1 月 1 日から 2014 年 1 月 1 日まで) にアクティブだったすべての行を返します。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;

次の例では、FOR SYSTEM_TIME CONTAINED IN ( date_time_literal_or_variable, date_time_literal_or_variable ) 引数を使用して、定義された期間 (2013 年 1 月 1 日から 2014 年 1 月 1 日まで) に開いて閉じられたすべての行を返します。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;

次の例では、リテラルではなく、変数を使用して、クエリの日付の境界値を指定します。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;

例: Azure SQL データ ウェアハウスAzure SQL Data Warehouse および Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL データ ウェアハウスAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

N.N. INNER JOIN 構文を使用するUsing the INNER JOIN syntax

次の例では、FactInternetSales テーブルと DimProduct テーブルから、結合キー ProductKey が両方のテーブルで一致する、SalesOrderNumberProductKeyEnglishProductName の列を返します。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. SalesOrderNumber 列とEnglishProductName 列はそれぞれ、どちらか一方のテーブルにしか存在しないため、示されているように、これらの列を持つテーブルの別名を指定する必要はありません。これらの別名は読みやすくするために含まれています。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. 別名の前の AS という単語は必須ではありませんが、読みやすくするためと 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;  

内部結合には INNER キーワードは必要ないため、これと同じクエリを次のように記述することができます。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;  

このクエリでも WHERE 句を使用して、結果を制限することができます。A WHERE clause could also be used with this query to limit results. 次の例では、結果を 'SO5000' よりも大きい SalesOrderNumber 値に制限します。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. LEFT OUTER JOIN と RIGHT OUTER JOIN 構文を使用するUsing the LEFT OUTER JOIN and RIGHT OUTER JOIN syntax

次の例では、FactInternetSales テーブルと DimProduct テーブルを ProductKey 列で結合します。The following example joins the FactInternetSales and DimProduct tables on the ProductKey columns. LEFT OUTER JOIN 構文は、左 (FactInternetSales) テーブルからの一致しない行を保持します。The left outer join syntax preserves the unmatched rows from the left (FactInternetSales) table. FactInternetSales テーブルには DimProduct テーブルと一致しない ProductKey 値は含まれないため、このクエリは、上記の最初の内部結合例と同じ行を返します。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;  

このクエリは、OUTER キーワードを使用しなくても記述できます。This query could also be written without the OUTER keyword.

右外部結合では、右テーブルからの一致しない行が保持されます。In right outer joins, the unmatched rows from the right table are preserved. 次の例では、上記の左外部結合の例と同じ行を返します。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;  

次のクエリは、左外部結合の左テーブルとして DimSalesTerritory テーブルを使用します。The following query uses the DimSalesTerritory table as the left table in a left outer join. FactInternetSales テーブルから SalesOrderNumber 値を取得します。It retrieves the SalesOrderNumber values from the FactInternetSales table. 特定の SalesTerritoryKey に注文がない場合は、クエリはその行の SalesOrderNumber に対して NULL を返します。If there are no orders for a particular SalesTerritoryKey, the query will return a NULL for the SalesOrderNumber for that row. このクエリは SalesOrderNumber 列で並べ替えられるため、この列内の NULL がすべて結果の上部に表示されます。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;  

このクエリは、右外部結合で書き直して同じ結果を取得することができます。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. FULL OUTER JOIN 構文を使用するUsing the FULL OUTER JOIN syntax

次の例では、両方の結合テーブルからすべての行を返しますが、別のテーブルと一致しない値には NULL を返す完全外部結合を示します。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;  

このクエリは、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. CROSS JOIN 構文を使用するUsing the CROSS JOIN syntax

次の例では、FactInternetSales テーブルと DimSalesTerritory テーブルのクロス積を返します。The following example returns the cross-product of the FactInternetSales and DimSalesTerritory tables. SalesOrderNumberSalesTerritoryKey のすべての可能な組み合わせの一覧が返されます。A list of all possible combinations of SalesOrderNumber and SalesTerritoryKey are returned. クロス結合クエリ内に ON 句がないことに注目してください。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. 派生テーブルを使用するUsing a derived table

次の例では、派生テーブル (FROM 句の後の SELECT ステートメント) を使用して、DimCustomer テーブル内で、BirthDate 値が 1970 年 1 月 1 日以降で、姓が 'Smith' のすべての顧客の CustomerKey 列と LastName 列を返します。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. REDUCE 結合ヒントの例REDUCE join hint example

次の例では、REDUCE 結合ヒントを使用して、クエリ内で派生テーブルの処理を変更します。The following example uses the REDUCE join hint to alter the processing of the derived table within the query. REDUCE 結合ヒントを使用する場合、fis.ProductKey は予測され、レプリケートされ、区別した後、ProductKey での DimProduct のシャッフル中に DimProduct に結合されます。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. 結果として得られる派生テーブルは、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. REPLICATE 結合ヒントの例REPLICATE join hint example

次の例は、前の例と同じクエリを示していますが、REDUCE 結合ヒントの代わりに REPLICATE 結合ヒントを使用している点が異なります。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. REPLICATE ヒントを使用すると、FactInternetSales テーブルの ProductKey (結合) 列の値がすべてのノードにレプリケートされます。Use of the REPLICATE hint causes the values in the ProductKey (joining) column from the FactInternetSales table to be replicated to all nodes. DimProduct テーブルは、これらの値のレプリケートされたバージョンに結合されます。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. REDISTRIBUTE ヒントを使用して、配布互換性のある結合に SHUFFLE_MOVE を保証するUsing the REDISTRIBUTE hint to guarantee a Shuffle move for a distribution incompatible join

次のクエリは、配布互換性のある結合で REDISTRIBUTE クエリ ヒントを使用します。The following query uses the REDISTRIBUTE query hint on a distribution incompatible join. これにより、クエリ オプティマイザーがクエリ プランで SHUFFLE_MOVE を使用することが保証されます。This guarantees the query optimizer will use a Shuffle move in the query plan. また、クエリ プランで分散テーブルをレプリケートされたテーブルに移動する、BROADCAST_MOVE を使用しないことも保証されます。This also guarantees the query plan will not use a Broadcast move which moves a distributed table to a replicated table.

次の例では、REDISTRIBUTE ヒントが FactInternetSales テーブルでの SHUFFLE_MOVE を強制します。これは、ProductKey は DimProduct のディストリビューション列で、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. TABLESAMPLE を使用してテーブル内のサンプル行からデータを読み取るUsing TABLESAMPLE to read data from a sample of rows in a table

次の例では、TABLESAMPLE 句内で FROM を使用して、10 テーブル内にあるすべての行の約 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) ;

参照See 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)
演算子 (Transact-SQL) Operators (Transact-SQL)
WHERE (Transact-SQL)WHERE (Transact-SQL)