FROM 절과 JOIN, APPLY, PIVOT(Transact-SQL)
적용 대상: Microsoft Fabric의 Microsoft Fabric Warehouse에 있는 SQL Server 2016(13.x) 이상 Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Platform System(PDW) SQL 분석 엔드포인트
Transact-SQL에서 FROM 절은 다음 명령문에서 사용할 수 있습니다.
일반적으로 FROM 절은 SELECT 문에 필요합니다. 예외는 테이블 열이 나열되지 않고 나열된 항목만 리터럴, 변수 또는 산술 식입니다.
이 문서에서는 FROM 절에서 사용할 수 있는 다음 키워드도 설명합니다.
구문
SQL Server 및 Azure SQL Database에 대한 구문:
[ FROM { <table_source> } [ , ...n ] ]
<table_source> ::=
{
table_or_view_name [ FOR SYSTEM_TIME <system_time> ] [ [ AS ] table_alias ]
[ <tablesample_clause> ]
[ WITH ( < table_hint > [ [ , ] ...n ] ) ]
| rowset_function [ [ AS ] table_alias ]
[ ( bulk_column_alias [ , ...n ] ) ]
| user_defined_function [ [ AS ] table_alias ]
| OPENXML <openxml_clause>
| derived_table [ [ AS ] table_alias ] [ ( column_alias [ , ...n ] ) ]
| <joined_table>
| <pivoted_table>
| <unpivoted_table>
| @variable [ [ AS ] table_alias ]
| @variable.function_call ( expression [ , ...n ] )
[ [ AS ] table_alias ] [ (column_alias [ , ...n ] ) ]
}
<tablesample_clause> ::=
TABLESAMPLE [ SYSTEM ] ( sample_number [ PERCENT | ROWS ] )
[ REPEATABLE ( repeat_seed ) ]
<joined_table> ::=
{
<table_source> <join_type> <table_source> ON <search_condition>
| <table_source> CROSS JOIN <table_source>
| left_table_source { CROSS | OUTER } APPLY right_table_source
| [ ( ] <joined_table> [ ) ]
}
<join_type> ::=
[ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
JOIN
<pivoted_table> ::=
table_source PIVOT <pivot_clause> [ [ AS ] table_alias ]
<pivot_clause> ::=
( aggregate_function ( value_column [ [ , ] ...n ] )
FOR pivot_column
IN ( <column_list> )
)
<unpivoted_table> ::=
table_source UNPIVOT <unpivot_clause> [ [ AS ] table_alias ]
<unpivot_clause> ::=
( value_column FOR pivot_column IN ( <column_list> ) )
<column_list> ::=
column_name [ , ...n ]
<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
병렬 데이터 웨어하우스, Azure Synapse Analytics에 대한 구문:
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 ] ) -- Azure Synapse Analytics Dedicated SQL pool 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
Microsoft Fabric 구문:
FROM { <table_source> [ , ...n ] }
<table_source> ::=
{
[ database_name . [ schema_name ] . | schema_name . ] table_or_view_name [ AS ] table_or_view_alias
| derived_table [ AS ] table_alias [ ( column_alias [ , ...n ] ) ]
| <joined_table>
}
<joined_table> ::=
{
<table_source> <join_type> <table_source> ON search_condition
| <table_source> CROSS JOIN <table_source>
| left_table_source { CROSS | OUTER } APPLY right_table_source
| [ ( ] <joined_table> [ ) ]
}
<join_type> ::=
[ INNER ] [ <join hint> ] JOIN
| LEFT [ OUTER ] JOIN
| RIGHT [ OUTER ] JOIN
| FULL [ OUTER ] JOIN
<join_hint> ::=
REDUCE
| REPLICATE
| REDISTRIBUTE
인수
<table_source>
Transact-SQL 문에서 사용할 테이블, 뷰, 테이블 변수 또는 파생된 테이블 원본을 별칭과 함께 또는 별칭 없이 지정합니다. 사용 가능한 메모리 및 쿼리에 있는 다른 식의 복잡성에 따라 다르지만 최대 256개의 테이블 원본을 문에 사용할 수 있습니다. 개별 쿼리는 최대 256개 테이블 원본을 지원하지 않을 수 있습니다.
참고
쿼리에서 많은 수의 테이블을 참조하면 쿼리 성능이 저하될 수 있습니다. 컴파일 및 최적화 시간 역시 다른 요소들의 영향을 받습니다. 여기에는 각 <table_source>에 대한 인덱스 및 인덱싱된 뷰의 존재 여부와 SELECT 문의 <select_list> 크기가 포함됩니다.
FROM 키워드 뒤의 테이블 원본 순서는 반환되는 결과 집합에 영향을 주지 않습니다. SQL Server는 FROM 절에 중복된 이름이 있으면 오류를 반환합니다.
table_or_view_name
테이블 또는 뷰의 이름입니다.
테이블 또는 뷰가 동일한 SQL Server 인스턴스의 다른 데이터베이스에 있는 경우 database.schema.object_name 형식의 정규화된 이름을 사용합니다.
테이블 또는 뷰가 SQL Server 인스턴스의 외부에 있는 경우 네 부분으로 구성된 linked_server.catalog.schema.object 형식의 이름을 사용합니다. 자세한 내용은 sp_addlinkedserver(Transact-SQL)의 데이터에 액세스하는 방법을 보여 줍니다. OPENDATASOURCE 함수를 이름의 서버 부분으로 사용하여 생성되는 네 부분으로 구성된 이름은 원격 테이블 원본을 지정하는 데 사용할 수도 있습니다. OPENDATASOURCE가 지정되면 database_name 및 schema_name이 모든 데이터 원본에 적용되지 않을 수 있으며, 원격 개체에 액세스하는 OLE DB 공급자 기능이 적용됩니다.
[AS] table_alias
편의상 또는 자체 조인 또는 하위 쿼리에서 테이블 또는 뷰를 구분하는 데 사용할 수 있는 table_source 별칭입니다. 별칭은 조인 내의 테이블의 특정 열을 지칭하는 데 사용하는 단축 테이블 이름인 경우가 많습니다. 조인의 두 개 이상의 테이블에 동일한 열 이름이 있는 경우 SQL Server에서는 이러한 열을 구분하기 위해 열 이름을 테이블 이름, 뷰 이름 또는 별칭으로 한정해야 할 수 있습니다. 별칭이 정의된 경우 테이블 이름을 사용할 수 없습니다.
파생 테이블, 행 집합, 테이블 반환 함수 또는 연산자 절(예: PIVOT 또는 UNPIVOT)을 사용하는 경우, 절의 끝 부분에 필요한 table_alias는 그룹화 열을 포함하여 반환되는 모든 열에 대해 연결된 테이블 이름입니다.
WITH (<table_hint> )
쿼리 최적화 프로그램에서 이 테이블과 이 문에 최적화 또는 잠금 전략을 사용하게 지정합니다. 자세한 내용은 테이블 힌트(Transact-SQL)를 참조하세요.
rowset_function
적용 대상: SQL Server 및 SQL Database.
테이블 참조 대신 사용할 수 있는 개체를 반환하는 OPENROWSET과 같은 행 집합 함수 중 하나를 지정합니다. 행 집합 함수의 목록에 자세한 내용은 행 집합 함수(Transact-SQL)를 참조하세요.
OPENROWSET 및 OPENQUERY 함수를 사용하여 원격 개체를 지정하는 것은 개체를 액세스하는 OLE DB 공급자의 기능에 따라 달라집니다.
bulk_column_alias
적용 대상: SQL Server 및 SQL Database.
결과 집합의 열 이름을 바꿀 선택적 별칭입니다. 열의 별칭은 BULK 옵션과 함께 OPENROWSET 함수를 사용하는 SELECT 문에서만 허용됩니다. bulk_column_alias를 사용하는 경우 파일의 열과 동일한 순서로 모든 테이블 열에 대한 별칭을 지정합니다.
참고
이 별칭은 XML 서식 파일(있는 경우)의 COLUMN 요소에 있는 NAME 특성보다 우선합니다.
user_defined_function
테이블 반환 함수를 지정합니다.
OPENXML <openxml_clause>
적용 대상: SQL Server 및 SQL Database.
XML 문서를 통해 행 집합 뷰를 제공합니다. 자세한 내용은 OPENXML(Transact-SQL)을 참조하세요.
derived_table
데이터베이스에서 행을 검색하는 하위 쿼리입니다. derived_table은 외부 쿼리에 대한 입력으로 사용됩니다.
derived_table은 Transact-SQL 테이블 값 생성자 기능을 사용하여 여러 행을 지정할 수 있습니다. 예: SELECT * FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);
. 자세한 내용은 테이블 값 생성자(Transact-SQL)를 참조하세요.
column_alias
파생 테이블의 결과 집합에서 열 이름을 바꿀 선택적 별칭입니다. SELECT 목록의 각 열당 한 개의 열 별칭을 포함하고 열 별칭의 전체 목록을 괄호로 묶습니다.
table_or_view_name FOR SYSTEM_TIME <system_time>
적용 대상: SQL Server 2016(13.x) 이상 버전 및 SQL Database.
지정된 임시 테이블 및 연결된 해당 시스템 버전 관리 기록 테이블에서 특정 버전의 데이터가 반환되도록 지정합니다.
TABLESAMPLE 절
적용 대상: SQL Server, SQL Database 및 Azure Synapse Analytics 전용 SQL 풀
테이블의 데이터 샘플이 반환되도록 지정합니다. 샘플은 근사치일 수 있습니다. 이 절은 SELECT 또는 UPDATE 문에서 기본 테이블 또는 조인된 테이블에 사용될 수 있습니다. 뷰를 사용하여 TABLESAMPLE을 지정할 수 없습니다.
참고 항목
SQL Server로 업그레이드된 데이터베이스에 대해 TABLESAMPLE을 사용할 때는 데이터베이스의 호환성 수준을 110 이상으로 설정해야 합니다. PIVOT이 CTE(공통 테이블 식) 쿼리에서 허용되지 않습니다. 자세한 내용은 ALTER DATABASE 호환성 수준(Transact-SQL)을 참조하세요.
SYSTEM
ISO 표준에 지정된 구현 종속 샘플링 방법입니다. SQL Server에서는 이 방법이 사용 가능한 유일한 샘플링 방법이므로 기본적으로 적용됩니다. SYSTEM은 테이블의 임의 페이지 집합을 샘플로 선택하는 페이지 기반 샘플링 방법을 적용하고 해당 페이지의 모든 행을 샘플 하위 집합으로 반환합니다.
sample_number
행의 백분율 또는 수를 나타내는 정확한 상수 또는 근사값 숫자 식입니다. PERCENT를 사용하여 지정되는 경우 sample_number는 암시적으로 float 값으로 변환되며, 그렇지 않으면 bigint로 변환됩니다. PERCENT는 기본값입니다.
PERCENT
테이블에서 테이블 행의 sample_number%를 검색하도록 지정합니다. PERCENT를 지정하면 SQL Server는 지정된 비율에 가장 가까운 결과를 반환합니다. PERCENT가 지정되면 sample_number 식은 0부터 100까지의 값으로 계산되어야 합니다.
ROWS
약 sample_number 행이 검색되도록 지정합니다. ROWS가 지정되면 SQL Server는 지정된 행 개수에 가장 가까운 결과를 반환합니다. ROWS가 지정되면 sample_number 식은 0보다 큰 정수 값으로 계산되어야 합니다.
REPEATABLE
선택된 샘플이 다시 반환될 수 있음을 나타냅니다. 동일한 repeat_seed 값으로 지정된 경우 SQL Server는 테이블의 행을 변경하지 않는 한 동일한 행 하위 집합을 반환합니다. 다른 repeat_seed 값으로 지정되면 SQL Server에서 테이블의 일부 다른 행 샘플을 반환합니다. 테이블에 대한 삽입, 업데이트, 삭제, 인덱스 다시 작성, 인덱스 조각 모음, 데이터베이스 복원 및 데이터베이스 연결 동작은 변경 사항으로 간주됩니다.
repeat_seed
SQL Server에서 난수를 생성하는 데 사용하는 상수 정수 식입니다. repeat_seed는 bigint입니다. repeat_seed 지정되지 않은 경우 SQL Server는 임의로 값을 할당합니다. 테이블에 변경내용이 적용되지 않은 경우 특정 repeat_seed 값에 대한 샘플링 결과는 항상 동일합니다. repeat_seed 식은 0보다 큰 정수로 계산되어야 합니다.
조인된 테이블
조인된 테이블은 두 개 이상의 테이블을 곱한 결과 집합입니다. 여러 조인이 있을 경우 괄호를 사용하여 조인의 기본 순서를 바꿀 수 있습니다.
조인 유형
조인 작업의 유형을 지정합니다.
INNER
일치하는 모든 행의 쌍이 반환되도록 지정합니다. 양 테이블에서 서로 일치하지 않는 행은 제외됩니다. 조인 유형을 지정하지 않는 경우 이것이 기본값입니다.
FULL [OUTER]
조인 조건을 충족하지 않는 왼쪽 또는 오른쪽 테이블의 행이 결과 집합에 포함되고 다른 테이블에 해당하는 출력 열이 NULL로 설정되도록 지정합니다. 여기에는 INNER JOIN에서 일반적으로 반환되는 모든 행도 포함됩니다.
LEFT [OUTER]
왼쪽 테이블에서 조인 조건에 맞지 않는 모든 행을 결과 집합에 포함시키고 내부 조인에서 반환된 모든 행과 오른쪽 테이블의 출력 열을 NULL로 설정하도록 지정합니다.
RIGHT [ OUTER ]
오른쪽 테이블에서 조인 조건에 맞지 않는 모든 행을 결과 집합에 포함하고 내부 조인에서 반환된 모든 행과 다른 테이블에 해당되는 출력 열을 NULL로 설정하도록 지정합니다.
조인 힌트
SQL Server 및 SQL Database의 경우 SQL Server 쿼리 최적화 프로그램에서 쿼리 FROM 절에 지정된 조인당 하나의 조인 힌트 또는 실행 알고리즘을 사용한다고 지정합니다. 자세한 내용은 조인 힌트(Transact-SQL)를 참조하세요.
Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)의 경우 이러한 조인 힌트는 호환되지 않는 두 개의 배포 열에 대한 INNER 조인에 적용됩니다. 쿼리 처리 중에 발생하는 데이터 이동의 양을 제한하여 쿼리 성능을 향상시킬 수 있습니다. Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)에 허용되는 조인 힌트는 다음과 같습니다.
REDUCE
호환되지 않는 두 개의 배포 테이블을 호환되도록 만들기 위해 조인의 오른쪽에 있는 테이블에 대해 이동할 행 수를 줄입니다. REDUCE 힌트는 세미조인 힌트라고도 합니다.
REPLICATE
조인 오른쪽에 있는 테이블에서 조인 열의 값이 모든 노드에 복제되도록 합니다. 왼쪽의 테이블은 해당 열의 복제된 버전에 조인됩니다.
REDISTRIBUTE
두 개의 데이터 원본이 JOIN 절에 지정된 열에 배포되도록 합니다. 분산 테이블의 경우 PDW(Analytics Platform System)는 순서 섞기 이동을 수행합니다. 복제된 테이블의 경우 PDW(Analytics Platform System)는 트리밍 이동을 수행합니다. 이러한 이동 유형을 이해하려면 PDW(Analytics Platform System) 제품 설명서의 "쿼리 계획 이해" 문서의 "DMS 쿼리 계획 작업" 섹션을 참조하세요. 이 힌트는 쿼리 계획에서 브로드캐스트 이동을 사용하여 호환되지 않는 배포 조인을 해결할 때 성능을 향상시킬 수 있습니다.
JOIN
지정된 테이블 원본 또는 뷰 간에 지정된 조인 작업이 이루어져야 함을 나타냅니다.
ON <search_condition>
조인의 기준이 되는 조건을 지정합니다. 열과 비교 연산자를 주로 사용하지만 조건에서는 모든 조건자를 지정할 수 있습니다. 예를 들어 다음과 같습니다.
SELECT p.ProductID,
v.BusinessEntityID
FROM Production.Product AS p
INNER JOIN Purchasing.ProductVendor AS v
ON (p.ProductID = v.ProductID);
조건이 열을 지정하는 경우 열의 이름이나 데이터 형식이 같을 필요는 없습니다. 그러나 데이터 형식이 동일하지 않은 경우 SQL Server에서 암시적으로 변환할 수 있는 형식 또는 호환되어야 합니다. 데이터 형식을 암시적으로 변환할 수 없는 경우 조건은 CONVERT 함수를 사용하여 데이터 형식을 명시적으로 변환해야 합니다.
ON 절에 단 하나의 조인된 테이블을 수반하는 조건자가 있을 수 있습니다. 또한 쿼리의 WHERE 절에도 이러한 조건자가 있을 수 있습니다. 이러한 조건자의 배치가 INNER 조인에 영향을 주지는 않지만 OUTER 조인이 관련될 때 다른 결과가 발생할 수 있습니다. ON 절의 조건자는 조인 이전의 테이블에 적용되는 반면 WHERE 절은 기능적으로 조인의 결과에 적용되기 때문입니다.
검색 조건 및 조건자에 대한 자세한 내용은 검색 조건(Transact-SQL)을 참조하세요.
CROSS JOIN
두 테이블의 교차곱을 지정합니다. SQL-92 형식이 아닌 이전 형식의 조인에서 WHERE 절이 지정되지 않은 경우와 동일한 행을 반환합니다.
left_table_source { CROSS | OUTER } APPLY right_table_source
APPLY 연산자의 right_table_source가 left_table_source의 모든 행에 대해 계산되도록 지정합니다. 이 기능은 right_table_source에 left_table_source의 열 값을 해당 인수 중 하나로 사용하는 테이블 반환 함수가 포함된 경우에 유용합니다.
CROSS 또는 OUTER를 APPLY와 함께 지정해야 합니다. CROSS가 지정되면 right_table_source가 left_table_source의 지정된 행에 대해 계산되고 빈 결과 집합을 반환할 때 아무 행도 생성되지 않습니다.
OUTER가 지정되면 right_table_source가 해당 행에 대해 계산되고 빈 결과 집합을 반환하는 경우에도 left_table_source의 각 행에 대한 하나의 행이 생성됩니다.
자세한 내용은 설명 섹션을 참조하세요.
left_table_source
이전 인수에 정의된 테이블 원본입니다. 자세한 내용은 주의 섹션을 참조하세요.
right_table_source
이전 인수에 정의된 테이블 원본입니다. 자세한 내용은 주의 섹션을 참조하세요.
PIVOT 절
table_source PIVOT <pivot_clause>
table_source가 pivot_column에 따라 피벗되도록 지정합니다. table_source는 테이블 또는 테이블 식입니다. 출력은 pivot_column 및 value_column을 제외한 table_source의 모든 열을 포함하는 테이블입니다. pivot_column 및 value_column을 제외한 table_source의 열은 PIVOT 연산자의 그룹화 열이라고 합니다. PIVOT 및 UNPIVOT에 대한 자세한 내용은 PIVOT 및 UNPIVOT 사용을 참조하세요.
PIVOT은 그룹화 열과 관련해 입력 테이블에서 그룹화 연산을 수행하고 각각의 그룹마다 한 개의 행을 반환합니다. 또한 출력에는 input_table의 pivot_column에 나타나는 column_list에 지정된 각 값에 대한 하나의 열이 포함됩니다.
자세한 내용은 다음에 나오는 주의 섹션을 참조하세요.
aggregate_function
하나 이상의 입력을 허용하는 시스템 또는 사용자 정의 집계 함수입니다. 집계 함수는 Null 값에 따라 결과가 달라지지 않아야 합니다. null 값에 고정된 집계 함수는 집계 값을 평가하는 동안 그룹의 null 값을 고려하지 않습니다.
COUNT(*) 시스템 집계 함수는 허용되지 않습니다.
value_column
PIVOT 연산자의 값 열입니다. UNPIVOT 와 함께 사용하는 경우 value_column 입력 table_source 기존 열의 이름이 될 수 없습니다.
FOR pivot_column
PIVOT 연산자의 피벗 열입니다. pivot_column은 암시적 또는 명시적으로 nvarchar() 로 변환할 수 있는 형식이어야 합니다. 이 열은 이미지 또는 rowversion일 수 없습니다.
UNPIVOT이 사용되면 pivot_column은 table_source에서 좁혀진 출력 열의 이름입니다. table_source 해당 이름의 기존 열 은 있을 수 없습니다.
IN( column_list )
PIVOT 절에서 출력 테이블의 열 이름이 되는 pivot_column 값을 나열합니다. 목록에서 피벗되는 입력 table_source 이미 있는 열 이름을 지정할 수 없습니다.
UNPIVOT 절에서 단일 pivot_column 좁혀진 table_source 열을 나열합니다.
table_alias
출력 테이블의 별칭 이름입니다. pivot_table_alias는 지정해야 합니다.
UNPIVOT <unpivot_clause>
입력 테이블이 column_list의 여러 열에서 pivot_column이라는 단일 열로 좁혀지도록 지정합니다. PIVOT 및 UNPIVOT에 대한 자세한 내용은 PIVOT 및 UNPIVOT 사용을 참조하세요.
AS OF <date_time>
적용 대상: SQL Server 2016(13.x) 이상 버전 및 SQL Database.
과거의 지정된 시간에 실제(현재)였던 값이 포함된 각 행에 대한 단일 레코드를 포함하는 테이블을 반환합니다. 내부적으로 임시 테이블과 해당 기록 테이블 간에 합집합이 계산되고, 결과가 필터링되어 <date_time> 매개 변수로 지정된 시점에 유효했던 행의 값을 반환합니다. system_start_time_column_name 값이 <date_time> 매개 변수 값보다 작거나 같고, system_end_time_column_name 값이 <date_time> 매개 변수 값보다 큰 경우 행에 대한 값이 유효한 것으로 간주됩니다.
start_date_time> end_date_time <<>
적용 대상: SQL Server 2016(13.x) 이상 버전 및 SQL Database.
FROM 인수에 대한 <start_date_time> 매개 변수 값 이전에 활성 상태가 시작되었는지, 아니면 TO 인수에 대한 <end_date_time> 매개 변수 값 이후에 활성 상태가 중단되었는지 여부에 관계없이, 지정된 시간 범위 내에 활성 상태였던 모든 레코드 버전에 대한 값이 포함된 테이블을 반환합니다. 내부적으로 temporal 테이블과 기록 테이블 간에 합집합이 계산되며, 지정된 시간 범위 중 임의의 시점에 활성 상태였던 모든 행 버전을 반환하도록 결과가 필터링됩니다. FROM 엔드포인트에서 정의한 하한에서 정확히 활성화된 행이 포함되며 TO 엔드포인트에서 정의한 상한에서 정확히 활성화된 행은 포함되지 않습니다.
BETWEEN <start_date_time> AND <end_date_time>
적용 대상: SQL Server 2016(13.x) 이상 버전 및 SQL Database.
<end_date_time> 엔드포인트에서 정의된 상위 경계에서 활성화된 행이 포함된다는 점을 제외하고는 위의 FROM <start_date_time> TO <end_date_time> 설명과 동일합니다.
CONTAINED IN (<start_date_time> , <end_date_time>)
적용 대상: SQL Server 2016(13.x) 이상 버전 및 SQL Database.
CONTAINED IN 인수에 대한 두 개의 datetime 값으로 정의된 지정된 시간 범위 내에 열리고 닫힌 모든 레코드 버전의 값을 포함하는 테이블을 반환합니다. 정확히 하위 경계에서 활성화되거나 상위 경계에서 활성 상태가 중단된 행이 포함됩니다.
ALL
현재 테이블과 기록 테이블의 모든 행에 있는 값이 포함된 테이블을 반환합니다.
설명
FROM 절은 조인된 테이블 및 파생 테이블에 대한 SQL-92 구문을 지원합니다. SQL-92 구문은 INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER, CROSS 조인 연산자를 제공합니다.
FROM 절의 UNION과 JOIN은 뷰, 파생된 테이블 및 하위 쿼리에서 지원됩니다.
자체 조인은 자신을 조인하는 테이블을 말합니다. 자체 조인을 기반으로 하는 삽입이나 업데이트 작업은 FROM 절에 지정된 순서를 따릅니다.
SQL Server는 열 배포 통계를 제공하는 연결된 서버의 배포 및 카디널리티 통계를 고려하므로 원격 조인 힌트는 조인을 강제로 원격으로 평가할 필요가 없습니다. SQL Server 쿼리 프로세서는 원격 통계를 고려하여 원격 조인 전략이 적절한지 결정합니다. 원격 조인 힌트는 열 분포 통계를 제공하지 않는 공급자에게 유용합니다.
APPLY 사용
APPLY 연산자의 좌우 피연산자는 모두 테이블 식입니다. 이러한 피연산자 간의 주요 차이점은 right_table_source에서 left_table_source의 열을 함수의 인수 중 하나로 사용하는 테이블 반환 함수를 사용할 수 있다는 것입니다. left_table_source 테이블 반환 함수를 포함할 수 있지만 right_table_source 열인 인수는 포함할 수 없습니다.
APPLY 연산자는 다음과 같은 방식으로 FROM 절에 지정될 테이블 원본을 생성합니다.
left_table_source의 각 행에 대해 right_table_source를 평가하여 행 집합을 생성합니다.
right_table_source의 값은 left_table_source에 따라 달라집니다. right_table_source는 대략
TVF(left_table_source.row)
와 같이 표현될 수 있습니다. 여기서TVF
는 테이블 반환 함수입니다.UNION ALL 연산을 수행하여 right_table_source를 평가할 때 각 행에 대해 생성된 결과 집합을 left_table_source와 결합합니다.
APPLY 연산자의 결과로 생성된 열 목록은 right_table_source의 열 목록과 결합된 left_table_source의 열 집합입니다.
PIVOT 및 UNPIVOT 사용
pivot_column 및 value_column은 PIVOT 연산자에서 사용되는 그룹화 열입니다. PIVOT은 다음과 같은 방식으로 출력 결과 집합을 가져옵니다.
input_table에서 그룹화 열을 기준으로 GROUP BY를 수행하고 각 그룹에 대해 하나의 출력 행을 생성합니다.
출력 행의 그룹화 열은 input_table에서 해당 그룹에 대한 해당 열 값을 가져옵니다.
다음 작업을 수행해 각각의 출력 행에 대한 열 목록의 열 값을 생성합니다.
추가적으로 이전 단계의 GROUP BY에서 생성된 행을 pivot_column을 기준으로 그룹화합니다.
column_list의 각 출력 열에 대해 조건에 맞는 하위 그룹을 선택합니다.
pivot_column = CONVERT(<data type of pivot_column>, 'output_column')
aggregate_function이 이 하위 그룹의 value_column에 대해 계산되고, 그 결과는 해당 output_column의 값으로 반환됩니다. 하위 그룹이 비어 있으면 SQL Server에서 해당 output_column에 대해 null 값을 생성합니다. 집계 함수가 COUNT이고 하위 그룹이 비어 있으면 0이 반환됩니다.
참고
UNPIVOT
절의 열 식별자는 카탈로그 데이터 정렬을 따릅니다. SQL Database의 경우 데이터 정렬은 항상 SQL_Latin1_General_CP1_CI_AS
입니다. 부분적으로 포함된 SQL Server 데이터베이스의 경우 데이터 정렬은 항상 Latin1_General_100_CI_AS_KS_WS_SC
입니다. 열이 다른 열과 결합되면 충돌을 피하기 위해 collate 절(COLLATE DATABASE_DEFAULT
)이 필요합니다.
예제를 포함하여 PIVOT 및 UNPIVOT에 대한 자세한 내용은 PIVOT 및 UNPIVOT 사용을 참조하세요.
사용 권한
DELETE, SELECT 또는 UPDATE 문의 사용 권한이 필요합니다.
예
A. FROM 절 사용
다음 예제에서는 AdventureWorks2022 TerritoryID
샘플 데이터베이스의 SalesTerritory
테이블에서 열과 Name
열을 검색합니다.
SELECT TerritoryID,
Name
FROM Sales.SalesTerritory
ORDER BY TerritoryID;
결과 집합은 다음과 같습니다.
TerritoryID Name
----------- ------------------------------
1 Northwest
2 Northeast
3 Central
4 Southwest
5 Southeast
6 Canada
7 France
8 Germany
9 Australia
10 United Kingdom
(10 row(s) affected)
B. TABLOCK 및 HOLDLOCK 최적화 프로그램 힌트 사용
다음의 부분 트랜잭션은 Employee
에 명시적인 공유 테이블 잠금을 설정하고 인덱스를 읽는 방법을 보여 줍니다. 잠금은 전체 트랜잭션 동안 유지됩니다.
BEGIN TRANSACTION
SELECT COUNT(*)
FROM HumanResources.Employee WITH (TABLOCK, HOLDLOCK);
C. SQL-92 CROSS JOIN 구문 사용
다음 예제에서는 두 테이블 Employee
과 Department
AdventureWorks2022 데이터베이스의 교차곱을 반환합니다. BusinessEntityID
행과 모든 Department
이름 행의 가능한 모든 조합 목록이 반환됩니다.
SELECT e.BusinessEntityID,
d.Name AS Department
FROM HumanResources.Employee AS e
CROSS JOIN HumanResources.Department AS d
ORDER BY e.BusinessEntityID,
d.Name;
D. SQL-92 FULL OUTER JOIN 구문 사용
다음 예제에서는 AdventureWorks2022 데이터베이스의 SalesOrderDetail
테이블에서 제품 이름과 해당 판매 주문을 반환합니다. 또한 Product
테이블에 나열되어 있는 제품이 없는 모든 판매 주문, 그리고 Product
테이블에 나열된 것 이외의 주문된 모든 제품을 반환합니다.
-- The OUTER keyword following the FULL keyword is optional.
SELECT p.Name,
sod.SalesOrderID
FROM Production.Product AS p
FULL JOIN Sales.SalesOrderDetail AS sod
ON p.ProductID = sod.ProductID
ORDER BY p.Name;
E. SQL-92 LEFT OUTER JOIN 구문 사용
다음 예에서는 ProductID
로 두 테이블을 조인하고 왼쪽 테이블에서 일치하지 않는 행도 함께 반환합니다. Product
테이블은 SalesOrderDetail
열에서 각 ProductID
테이블과 일치합니다. 모든 제품은 주문 여부에 관계없이 결과 집합에 나타납니다.
SELECT p.Name,
sod.SalesOrderID
FROM Production.Product AS p
LEFT OUTER JOIN Sales.SalesOrderDetail AS sod
ON p.ProductID = sod.ProductID
ORDER BY p.Name;
F. SQL-92 INNER JOIN 구문 사용
다음 예에서는 모든 제품 이름과 판매 주문 ID를 반환합니다.
-- 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. SQL-92 RIGHT OUTER JOIN 구문 사용
다음 예에서는 TerritoryID
로 두 테이블을 조인하고 오른쪽 테이블에서 일치하지 않는 행도 함께 반환합니다. SalesTerritory
테이블은 SalesPerson
열에서 각 TerritoryID
테이블과 일치합니다. 판매 직원에게 담당 구역이 할당되었는지 여부에 관계없이 모든 판매 직원이 결과 집합에 표시됩니다.
SELECT st.Name AS Territory,
sp.BusinessEntityID
FROM Sales.SalesTerritory AS st
RIGHT OUTER JOIN Sales.SalesPerson AS sp
ON st.TerritoryID = sp.TerritoryID;
H. HASH 및 MERGE 조인 힌트 사용
다음 예에서는 Product
, ProductVendor
및 Vendor
테이블 간의 3개 테이블 조인을 수행하여 제품 및 제품 공급업체 목록을 생성합니다. 쿼리 최적화 프로그램은 MERGE 조인을 사용하여 Product
와 ProductVendor
(p
와 pv
)를 조인합니다. 그런 다음 Product
와 ProductVendor
(p
와 pv
)의 MERGE 조인이 Vendor
테이블에 HASH 조인되어 (p
와 pv
) 및 v
를 생성합니다.
중요
조인 힌트를 지정한 이후에는 INNER 키워드가 더 이상 선택 사항이 아니며 INNER JOIN을 수행하도록 명시적으로 지정해야 합니다.
SELECT p.Name AS ProductName,
v.Name AS VendorName
FROM Production.Product AS p
INNER MERGE JOIN Purchasing.ProductVendor AS pv
ON p.ProductID = pv.ProductID
INNER HASH JOIN Purchasing.Vendor AS v
ON pv.BusinessEntityID = v.BusinessEntityID
ORDER BY p.Name,
v.Name;
9\. 파생 테이블 사용
다음 예에서는 파생된 테이블과 SELECT
문을 FROM
절 다음에 사용하여 모든 직원의 성과 이름, 직원이 거주하는 도시를 반환합니다.
SELECT RTRIM(p.FirstName) + ' ' + LTRIM(p.LastName) AS Name,
d.City
FROM Person.Person AS p
INNER JOIN HumanResources.Employee e
ON p.BusinessEntityID = e.BusinessEntityID
INNER JOIN (
SELECT bea.BusinessEntityID,
a.City
FROM Person.Address AS a
INNER JOIN Person.BusinessEntityAddress AS bea
ON a.AddressID = bea.AddressID
) AS d
ON p.BusinessEntityID = d.BusinessEntityID
ORDER BY p.LastName,
p.FirstName;
J. TABLESAMPLE을 사용하여 테이블의 행 샘플에서 데이터 읽기
다음 예에서는 TABLESAMPLE
절에 FROM
을 사용하여 10
테이블에 있는 모든 행 중 대략 Customer
퍼센트를 반환합니다.
SELECT *
FROM Sales.Customer TABLESAMPLE SYSTEM(10 PERCENT);
11. APPLY 사용
다음 예제에서는 다음 테이블 및 테이블 반환 함수가 데이터베이스에 존재한다고 가정합니다.
개체 이름 | 열 이름 |
---|---|
Departments | DeptID, DivisionID, DeptName, DeptMgrID |
EmpMgr | MgrID, EmpID |
Employees | EmpID, EmpLastName, EmpFirstName, EmpSalary |
GetReports(MgrID) | EmpID, EmpLastName, EmpSalary |
GetReports
테이블 반환 함수는 지정된 MgrID
에 직접 또는 간접적으로 보고하는 모든 직원의 목록을 반환합니다.
이 예에서는 APPLY
를 사용하여 모든 부서와 해당 부서의 모든 직원을 반환합니다. 특정 부서에 직원이 없는 경우 해당 부서에 대해 반환되는 행이 없습니다.
SELECT DeptID,
DeptName,
DeptMgrID,
EmpID,
EmpLastName,
EmpSalary
FROM Departments d
CROSS APPLY dbo.GetReports(d.DeptMgrID);
쿼리가 직원이 없는 부서의 행도 생성하도록 하려면 EmpID
를 사용하세요. 이 때 EmpLastName
, EmpSalary
및 OUTER APPLY
열에 대해서는 Null 값이 생성됩니다.
SELECT DeptID,
DeptName,
DeptMgrID,
EmpID,
EmpLastName,
EmpSalary
FROM Departments d
OUTER APPLY dbo.GetReports(d.DeptMgrID);
12. CROSS APPLY 사용
다음 예제는 sys.dm_exec_cached_plans
동적 관리 뷰를 쿼리하여 캐시에 있는 모든 쿼리 계획의 계획 핸들을 검색함으로써 계획 캐시에 있는 모든 쿼리 계획의 스냅샷을 검색합니다. 그런 다음 CROSS APPLY
에 계획 핸들을 전달할 sys.dm_exec_query_plan
연산자를 지정합니다. 계획 캐시에 있는 각 계획의 XML 실행 계획 출력은 현재 반환된 테이블의 query_plan
열에 있습니다.
USE master;
GO
SELECT dbid,
object_id,
query_plan
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle);
GO
13. FOR SYSTEM_TIME 사용
적용 대상: SQL Server 2016(13.x) 이상 버전 및 SQL Database.
다음 예제에서는 FOR SYSTEM_TIME AS OF date_time_literal_or_variable 인수를 사용하여 2014년 1월 1일 현재 실제(현재)인 테이블 행을 반환합니다.
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일로 끝나는 것으로 정의된 기간 동안 활성 상태였던 모든 행을 상한 전용으로 반환합니다.
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일로 끝나는 것으로 정의된 기간 동안 활성 상태였던 모든 행을 상한을 포함합니다.
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일로 끝나는 기간 동안 열리고 닫힌 모든 행을 반환합니다.
SELECT DepartmentNumber,
DepartmentName,
ManagerID,
ParentDepartmentNumber
FROM DEPARTMENT
FOR SYSTEM_TIME CONTAINED IN ('2013-01-01', '2014-01-01')
WHERE ManagerID = 5;
다음 예제에서는 리터럴이 아닌 변수를 사용하여 쿼리에 대한 날짜 경계 값을 제공합니다.
DECLARE @AsOfFrom DATETIME2 = DATEADD(month, -12, SYSUTCDATETIME());
DECLARE @AsOfTo DATETIME2 = DATEADD(month, -6, SYSUTCDATETIME());
SELECT DepartmentNumber,
DepartmentName,
ManagerID,
ParentDepartmentNumber
FROM DEPARTMENT
FOR SYSTEM_TIME
FROM @AsOfFrom TO @AsOfTo
WHERE ManagerID = 5;
예: Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)
14. INNER JOIN 구문 사용
다음 예제에서는 두 테이블 모두에서 ProductKey
조인 키가 일치하는 FactInternetSales
및 DimProduct
테이블에서 SalesOrderNumber
, ProductKey
및 EnglishProductName
열을 반환합니다. 각 열과 EnglishProductName
열은 SalesOrderNumber
테이블 중 하나에만 존재하므로 다음과 같이 이러한 열로 테이블 별칭을 지정할 필요가 없습니다. 이러한 별칭은 가독성을 위해 포함됩니다. 별칭 이름 앞에 AS라는 단어는 필요하지 않지만 가독성과 ANSI 표준을 준수하는 것이 좋습니다.
-- Uses AdventureWorks
SELECT fis.SalesOrderNumber,
dp.ProductKey,
dp.EnglishProductName
FROM FactInternetSales AS fis
INNER JOIN DimProduct AS dp
ON dp.ProductKey = fis.ProductKey;
내부 조인에는 INNER
키워드가 필요하지 않으므로 다음과 같은 쿼리를 작성할 수 있습니다.
-- Uses AdventureWorks
SELECT fis.SalesOrderNumber,
dp.ProductKey,
dp.EnglishProductName
FROM FactInternetSales AS fis
INNER JOIN DimProduct AS dp
ON dp.ProductKey = fis.ProductKey;
또한 이 쿼리에 WHERE
절을 사용하여 결과를 제한할 수도 있습니다. 다음 예제에서는 결과를 'SO5000'보다 높은 SalesOrderNumber
값으로 제한합니다.
-- Uses AdventureWorks
SELECT fis.SalesOrderNumber,
dp.ProductKey,
dp.EnglishProductName
FROM FactInternetSales AS fis
INNER JOIN DimProduct AS dp
ON dp.ProductKey = fis.ProductKey
WHERE fis.SalesOrderNumber > 'SO50000'
ORDER BY fis.SalesOrderNumber;
15. LEFT OUTER JOIN 및 RIGHT OUTER JOIN 구문 사용
다음 예제에서는 FactInternetSales
및 DimProduct
테이블을 ProductKey
열에 조인합니다. 왼쪽 우선 외부 조인 구문은 왼쪽(FactInternetSales
) 테이블에서 일치하지 않는 행을 유지합니다. FactInternetSales
테이블에 테이블과 일치하지 DimProduct
않는 값이 포함되어 ProductKey
있지 않으므로 이 쿼리는 이 문서의 앞부분에 있는 첫 번째 내부 조인 예제와 동일한 행을 반환합니다.
-- Uses AdventureWorks
SELECT fis.SalesOrderNumber,
dp.ProductKey,
dp.EnglishProductName
FROM FactInternetSales AS fis
LEFT OUTER JOIN DimProduct AS dp
ON dp.ProductKey = fis.ProductKey;
또한 이 쿼리는 OUTER
키워드 없이 작성할 수도 있습니다.
오른쪽 우선 외부 조인에서는 오른쪽 테이블에서 일치하지 않는 행이 유지됩니다. 다음 예제에서는 위의 왼쪽 우선 외부 조인 예제와 동일한 행을 반환합니다.
-- Uses AdventureWorks
SELECT fis.SalesOrderNumber,
dp.ProductKey,
dp.EnglishProductName
FROM DimProduct AS dp
RIGHT OUTER JOIN FactInternetSales AS fis
ON dp.ProductKey = fis.ProductKey;
다음 쿼리에서는 DimSalesTerritory
테이블을 왼쪽 우선 외부 조인의 왼쪽 테이블로 사용합니다. FactInternetSales
테이블에서 SalesOrderNumber
값을 검색합니다. 특정 SalesTerritoryKey
행에 대한 주문이 없으면 쿼리는 해당 행에 대한 NULL을 SalesOrderNumber
반환합니다. 이 쿼리는 열에 따라 SalesOrderNumber
정렬되므로 이 열의 NULL이 결과의 맨 위에 표시됩니다.
-- Uses AdventureWorks
SELECT dst.SalesTerritoryKey,
dst.SalesTerritoryRegion,
fis.SalesOrderNumber
FROM DimSalesTerritory AS dst
LEFT OUTER JOIN FactInternetSales AS fis
ON dst.SalesTerritoryKey = fis.SalesTerritoryKey
ORDER BY fis.SalesOrderNumber;
이 쿼리는 동일한 결과를 검색하기 위해 오른쪽 우선 외부 조인으로 다시 작성할 수 있습니다.
-- Uses AdventureWorks
SELECT dst.SalesTerritoryKey,
dst.SalesTerritoryRegion,
fis.SalesOrderNumber
FROM FactInternetSales AS fis
RIGHT OUTER JOIN DimSalesTerritory AS dst
ON fis.SalesTerritoryKey = dst.SalesTerritoryKey
ORDER BY fis.SalesOrderNumber;
16. FULL OUTER JOIN 구문 사용
다음 예제에서는 조인된 두 테이블의 모든 행을 반환하지만 다른 테이블과 일치하지 않는 값에 대해 NULL을 반환하는 전체 외부 조인을 보여 줍니다.
-- 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;
또한 이 쿼리는 OUTER
키워드 없이 작성할 수도 있습니다.
-- Uses AdventureWorks
SELECT dst.SalesTerritoryKey,
dst.SalesTerritoryRegion,
fis.SalesOrderNumber
FROM DimSalesTerritory AS dst
FULL JOIN FactInternetSales AS fis
ON dst.SalesTerritoryKey = fis.SalesTerritoryKey
ORDER BY fis.SalesOrderNumber;
17. CROSS JOIN 구문 사용
다음 예제에서는 FactInternetSales
및 DimSalesTerritory
테이블의 교차곱을 반환합니다. SalesOrderNumber
및 SalesTerritoryKey
의 가능한 모든 조합 목록이 반환됩니다. 크로스 조인 쿼리에 ON
절이 없습니다.
-- Uses AdventureWorks
SELECT dst.SalesTerritoryKey,
fis.SalesOrderNumber
FROM DimSalesTerritory AS dst
CROSS JOIN FactInternetSales AS fis
ORDER BY fis.SalesOrderNumber;
18. 파생 테이블 사용
다음 예제에서는 파생 테이블(FROM
절 뒤의 SELECT
문)을 사용하여 DimCustomer
테이블에서 1970년 1월 1일 이후의 BirthDate
값과 'Smith' 성이 있는 모든 고객의 CustomerKey
및 LastName
열을 반환합니다.
-- Uses AdventureWorks
SELECT CustomerKey,
LastName
FROM (
SELECT *
FROM DimCustomer
WHERE BirthDate > '01/01/1970'
) AS DimCustomerDerivedTable
WHERE LastName = 'Smith'
ORDER BY LastName;
S.는 REDUCE 조인 힌트 예제
다음 예제에서는 REDUCE
조인 힌트를 사용하여 쿼리 내에서 파생 테이블의 처리를 변경합니다. 이 쿼리에서 REDUCE
조인 힌트를 사용하면 fis.ProductKey
가 고유하게 투영되고, 복제되고, 만들어진 다음, ProductKey
에서 DimProduct
의 순서를 섞는 중에 DimProduct
에 조인됩니다. 결과 파생 테이블은 fis.ProductKey
에 배포됩니다.
-- Uses AdventureWorks
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. REPLICATE 조인 힌트 예제
다음 예제에서는 REDUCE
조인 힌트 대신 REPLICATE
조인 힌트가 사용된다는 점을 제외하고는 위의 예제와 동일한 쿼리를 보여 줍니다. REPLICATE
힌트를 사용하면 FactInternetSales
테이블의 ProductKey
(조인) 열의 값이 모든 노드에 복제됩니다. DimProduct
테이블은 해당 값의 복제된 버전에 조인됩니다.
-- Uses AdventureWorks
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. REDISTRIBUTE 힌트를 사용하여 호환되지 않는 배포 조인에 대한 순서 섞기 이동을 보장합니다.
다음 쿼리에서는 호환되지 않는 배포 조인에서 REDISTRIBUTE 쿼리 힌트를 사용합니다. 이렇게 하면 쿼리 최적화 프로그램에서 쿼리 계획에서 순서 섞기 이동을 사용할 수 있습니다. 또한 쿼리 계획이 분산 테이블을 복제된 테이블로 이동하는 브로드캐스트 이동을 사용하지 않도록 보장합니다.
다음 예제에서는 ProductKey가 DimProduct의 배포 열이며 FactInternetSales의 배포 열이 아니므로 REDISTRIBUTE 힌트는 FactInternetSales 테이블에서 순서 섞기 이동을 강제합니다.
-- Uses AdventureWorks
SELECT dp.ProductKey,
fis.SalesOrderNumber,
fis.TotalProductCost
FROM DimProduct AS dp
INNER REDISTRIBUTE JOIN FactInternetSales AS fis
ON dp.ProductKey = fis.ProductKey;
V. TABLESAMPLE을 사용하여 테이블의 행 샘플에서 데이터 읽기
다음 예에서는 TABLESAMPLE
절에 FROM
을 사용하여 10
테이블에 있는 모든 행 중 대략 Customer
퍼센트를 반환합니다.
SELECT *
FROM Sales.Customer TABLESAMPLE SYSTEM(10 PERCENT);