FROM 절과 JOIN, APPLY, PIVOT(Transact-SQL)FROM clause plus JOIN, APPLY, PIVOT (Transact-SQL)

적용 대상: 예SQL Server 예Azure SQL Database 예Azure SQL Data Warehouse 예병렬 데이터 웨어하우스 APPLIES TO: yesSQL Server 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. 사용 가능한 메모리 및 쿼리에 있는 다른 식의 복잡성에 따라 다르지만 최대 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. SQL ServerSQL Server는 FROM 절에 중복된 이름이 있으면 오류를 반환합니다.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 형식의 이름을 사용합니다.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 함수를 이름의 서버 부분으로 사용하여 생성되는 네 부분으로 구성된 이름은 원격 테이블 원본을 지정하는 데 사용할 수도 있습니다.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_nameschema_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 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017SQL DatabaseSQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and SQL DatabaseSQL 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 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017SQL DatabaseSQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and SQL DatabaseSQL 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 2008SQL Server 2008부터 SQL Server 2017SQL Server 2017SQL DatabaseSQL Database까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and SQL DatabaseSQL 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은 외부 쿼리에 대한 입력으로 사용됩니다.derived_table is used as input to the outer query.

derived _tableTransact-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. SELECT 목록의 각 열당 한 개의 열 별칭을 포함하고 열 별칭의 전체 목록을 괄호로 묶습니다.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 DatabaseSQL DatabaseApplies to: SQL Server 2016(13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL DatabaseSQL 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 이상으로 설정해야 합니다. PIVOT이 CTE(공통 테이블 식) 쿼리에서 허용되지 않습니다.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

조인된 테이블은 두 개 이상의 테이블을 곱한 결과 집합입니다.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 ServerSQL DatabaseSQL Database의 경우 SQL ServerSQL Server 쿼리 최적화 프로그램에서 쿼리의 FROM 절에 지정된 조인마다 하나의 조인 힌트 또는 실행 알고리즘을 사용하도록 지정합니다.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 Warehouse의 경우 이러한 조인 힌트는 호환되지 않는 두 개의 배포 열에 대한 INNER 조인에 적용됩니다.For SQL 데이터 웨어하우스SQL Data Warehouse and 병렬 데이터 웨어하우스Parallel 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 Warehouse에 허용되는 조인 힌트는 다음과 같습니다.The allowable join hints for SQL 데이터 웨어하우스SQL Data Warehouse and 병렬 데이터 웨어하우스Parallel Data Warehouse are as follows:

REDUCEREDUCE
호환되지 않는 두 개의 배포 테이블을 호환되도록 만들기 위해 조인의 오른쪽에 있는 테이블에 대해 이동할 행 수를 줄입니다.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 힌트는 세미조인 힌트라고도 합니다.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
두 개의 데이터 원본이 JOIN 절에 지정된 열에 배포되도록 합니다.Forces two data sources to be distributed on columns specified in the JOIN clause. 분산된 테이블의 경우 병렬 데이터 웨어하우스Parallel Data Warehouse은 순서 섞기 이동을 수행합니다.For a distributed table, 병렬 데이터 웨어하우스Parallel Data Warehouse will perform a shuffle move. 복제된 테이블의 경우 병렬 데이터 웨어하우스Parallel Data Warehouse은 자르기 이동을 수행합니다.For a replicated table, 병렬 데이터 웨어하우스Parallel Data Warehouse will perform a trim move. 이러한 이동 유형을 이해하려면 Parallel Data Warehouse product documentation(병렬 데이터 웨어하우스 제품 설명서)Parallel Data Warehouse product documentation의 "쿼리 계획 이해" 항목에 있는 "DMS 쿼리 계획 작업" 섹션을 참조하세요.To understand these move types, see the "DMS Query Plan Operations" section in the "Understanding Query Plans" topic in the Parallel Data Warehouse product documentation(병렬 데이터 웨어하우스 제품 설명서)Parallel Data Warehouse product documentation. 이 힌트는 쿼리 계획에서 브로드캐스트 이동을 사용하여 호환되지 않는 배포 조인을 해결할 때 성능을 향상시킬 수 있습니다.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
두 테이블의 교차곱을 지정합니다.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_sourceleft_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가 지정되면 right_table_sourceleft_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가 지정되면 right_table_source가 해당 행에 대해 계산되고 빈 결과 집합을 반환하는 경우에도 left_table_source의 각 행에 대한 하나의 행이 생성됩니다.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_columnvalue_column을 제외한 table_source의 모든 열을 포함하는 테이블입니다.The output is a table that contains all columns of the table_source except the pivot_column and value_column. pivot_columnvalue_column을 제외한 table_source의 열은 PIVOT 연산자의 그룹화 열이라고 합니다.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은 그룹화 열과 관련해 입력 테이블에서 그룹화 연산을 수행하고 각각의 그룹마다 한 개의 행을 반환합니다.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에 지정된 각 값에 대한 하나의 열이 포함됩니다.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
하나 이상의 입력을 받는 시스템 또는 사용자 정의 집계 함수입니다.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_columntable_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 2017SQL DatabaseSQL Database까지Applies to: SQL Server 2016(13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL DatabaseSQL Database.

과거의 지정된 시간에 실제(현재)였던 값이 포함된 각 행에 대한 단일 레코드를 포함하는 테이블을 반환합니다.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 DatabaseSQL DatabaseApplies to: SQL Server 2016(13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL DatabaseSQL 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. 내부적으로 temporal 테이블과 기록 테이블 간에 합집합이 계산되며, 지정된 시간 범위 중 임의의 시점에 활성 상태였던 모든 행 버전을 반환하도록 결과가 필터링됩니다.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 엔드포인트에서 정의된 하위 경계에서 정확히 활성화된 행은 포함되고, TO 엔드포인트에서 정의된 상위 경계에서 정확히 활성화된 행은 포함되지 않습니다.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 DatabaseSQL DatabaseApplies to: SQL Server 2016(13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL DatabaseSQL 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 2017SQL DatabaseSQL Database까지Applies to: SQL Server 2016(13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL DatabaseSQL Database.

CONTAINED IN 인수에 대한 두 개의 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_columnvalue_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를 수행하고 각 그룹에 대해 하나의 출력 행을 생성합니다.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. 추가적으로 이전 단계의 GROUP BY에서 생성된 행을 pivot_column을 기준으로 그룹화합니다.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

1.A. 간단한 FROM 절 사용Using a simple FROM clause

다음 예에서는 AdventureWorks2012AdventureWorks2012 샘플 데이터베이스에서 TerritoryID 테이블의 NameSalesTerritory을 검색합니다.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)  

2.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 데이터베이스에서 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로 두 테이블을 조인하고 왼쪽 테이블에서 일치하지 않는 행도 함께 반환합니다.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로 두 테이블을 조인하고 오른쪽 테이블에서 일치하지 않는 행도 함께 반환합니다.The following example joins two tables on TerritoryID and preserves the unmatched rows from the right table. SalesTerritory 테이블은 SalesPerson 열에서 각 TerritoryID 테이블과 일치합니다.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

다음 예에서는 Product, ProductVendorVendor 테이블 간의 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(ppv)의 MERGE 조인이 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 ;  

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

11.K. APPLY 사용Using APPLY

다음 예제에서는 다음 테이블 및 테이블 반환 함수가 데이터베이스에 존재한다고 가정합니다.The following example assumes that the following tables and table-valued function exist in the database:

개체 이름Object Name 열 이름Column Names
부서Departments 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

GetReports 테이블 반환 함수는 지정된 MgrID에 직접 또는 간접적으로 보고하는 모든 직원의 목록을 반환합니다.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) ;  

쿼리가 직원이 없는 부서의 행도 생성하도록 하려면 EmpID를 사용하세요. 이 때 EmpLastName, EmpSalaryOUTER APPLY 열에 대해서는 Null 값이 생성됩니다.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) ;  

12.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. 그런 다음 CROSS APPLY에 계획 핸들을 전달할 sys.dm_exec_query_plan 연산자를 지정합니다.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  

13.M. FOR SYSTEM_TIME 사용Using FOR SYSTEM_TIME

적용 대상: SQL Server 2016(13.x)SQL Server 2016 (13.x)부터 SQL Server 2017SQL Server 2017까지 및 SQL DatabaseSQL DatabaseApplies to: SQL Server 2016(13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL DatabaseSQL 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 WarehouseExamples: Azure SQL 데이터 웨어하우스Azure SQL Data Warehouse and 병렬 데이터 웨어하우스Parallel Data Warehouse

14.N. INNER JOIN 구문 사용Using the INNER JOIN syntax

다음 예제에서는 두 테이블 모두에서 ProductKey 조인 키가 일치하는 FactInternetSalesDimProduct 테이블에서 SalesOrderNumber, ProductKeyEnglishProductName 열을 반환합니다.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. SalesOrderNumberEnglishProductName 열은 각각 테이블 중 하나에만 존재하므로 이러한 열을 표시된 대로 사용하여 테이블 별칭을 지정할 필요가 없습니다. 이러한 별칭은 가독성을 높이기 위해 포함되었습니다.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;  

15.O. LEFT OUTER JOIN 및 RIGHT OUTER JOIN 구문 사용Using the LEFT OUTER JOIN and RIGHT OUTER JOIN syntax

다음 예제에서는 FactInternetSalesDimProduct 테이블을 ProductKey 열에 조인합니다.The following example joins the FactInternetSales and DimProduct tables on the ProductKey columns. 왼쪽 우선 외부 조인 구문은 왼쪽(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;  

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

17.Q. CROSS JOIN 구문 사용Using the CROSS JOIN syntax

다음 예제에서는 FactInternetSalesDimSalesTerritory 테이블의 교차곱을 반환합니다.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;  

18.R. 파생된 테이블 사용Using a derived table

다음 예제에서는 파생 테이블(FROM 절 뒤의 SELECT 문)을 사용하여 DimCustomer 테이블에서 1970년 1월 1일 이후의 BirthDate 값과 'Smith' 성이 있는 모든 고객의 CustomerKeyLastName 열을 반환합니다.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;  

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

21.U. REDISTRIBUTE 힌트를 사용하여 호환되지 않는 배포 조인에 대한 순서 섞기 이동 보장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. 이렇게 하면 쿼리 최적화 프로그램이 쿼리 계획에서 순서 섞기 이동을 사용하도록 보장합니다.This guarantees the query optimizer will use a Shuffle move in the query plan. 또한 쿼리 계획에서 분산된 테이블을 복제된 테이블로 이동하는 브로드캐스트 이동을 사용하지 않도록 보장합니다.This also guarantees the query plan will not use a Broadcast move which moves a distributed table to a replicated table.

다음 예제에서는 ProductKey가 DimProduct에 대한 배포 열이고 FactInternetSales에 대한 배포 열이 아니기 때문에 REDISTRIBUTE 힌트는 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;  

22.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)