KLAUZULA FROM plus JOIN, APPLY, PIVOT (Transact-SQL)
Dotyczy: SQL Server 2016 (13.x) i nowsze wersje Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)punkt końcowy analizy SQL w usłudze Microsoft FabricWarehouse w usłudze Microsoft FabricSQL Database w usłudze Microsoft Fabric
W języku Transact-SQL klauzula FROM jest dostępna w następujących instrukcjach:
Klauzula FROM jest zwykle wymagana w instrukcji SELECT. Wyjątek występuje, gdy nie są wyświetlane żadne kolumny tabeli, a jedynymi elementami na liście są literały lub zmienne lub wyrażenia arytmetyczne.
W tym artykule omówiono również następujące słowa kluczowe, których można użyć w klauzuli FROM:
- JOIN
- ZASTOSOWAĆ
- przestawnych
Transact-SQL konwencje składni
Składnia
Składnia dla programu SQL Server, usługi Azure SQL Database i bazy danych SQL fabric:
[ 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
Składnia usługi Parallel Data Warehouse, 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
Składnia dla usługi 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
Argumenty
<table_source>
Określa tabelę, widok, zmienną tabeli lub źródło tabeli pochodnej, z aliasem lub bez niego, do użycia w instrukcji Transact-SQL. W instrukcji można używać maksymalnie 256 źródeł tabel, chociaż limit różni się w zależności od dostępnej pamięci i złożoności innych wyrażeń w zapytaniu. Pojedyncze zapytania mogą nie obsługiwać maksymalnie 256 źródeł tabel.
Nuta
Wydajność zapytań może mieć wiele tabel, do których odwołuje się zapytanie. Czas kompilacji i optymalizacji ma również wpływ na dodatkowe czynniki. Obejmują one obecność indeksów i indeksowanych widoków dla każdej <table_source> oraz rozmiar <select_list> w instrukcji SELECT.
Kolejność źródeł tabeli po słowie kluczowym FROM nie ma wpływu na zwracany zestaw wyników. Program SQL Server zwraca błędy, gdy w klauzuli FROM pojawiają się zduplikowane nazwy.
table_or_view_name
Nazwa tabeli lub widoku.
Jeśli tabela lub widok istnieje w innej bazie danych w tym samym wystąpieniu programu SQL Server, użyj w pełni kwalifikowanej nazwy w formularzu bazy danych.schematu.object_name.
Jeśli tabela lub widok istnieje poza wystąpieniem programu SQL Serverl, użyj czteroczęściowej nazwy w formularzu linked_server.katalogu.schemat.obiekt. Aby uzyskać więcej informacji, zobacz sp_addlinkedserver (Transact-SQL). Nazwa czteroczęściowa, która jest tworzona przy użyciu funkcji OPENDATASOURCE jako część nazwy serwera, może również służyć do określania źródła tabeli zdalnej. Po określeniu parametru OPENDATASOURCE database_name i schema_name mogą nie mieć zastosowania do wszystkich źródeł danych i podlegają możliwościom dostawcy OLE DB, który uzyskuje dostęp do obiektu zdalnego.
[AS] table_alias
Alias dla table_source, który może być używany dla wygody lub do odróżnienia tabeli lub widoku w trybie samosprzężenia lub podzapytania. Alias jest często skróconą nazwą tabeli używaną do odwoływania się do określonych kolumn tabel w sprzężeniu. Jeśli ta sama nazwa kolumny istnieje w więcej niż jednej tabeli w sprzężeniu, program SQL Server może wymagać, aby nazwa kolumny została kwalifikowana przez nazwę tabeli, nazwę widoku lub alias, aby odróżnić te kolumny. Nie można użyć nazwy tabeli, jeśli zdefiniowano alias.
W przypadku użycia pochodnej tabeli, zestawu wierszy lub funkcji tabeli albo klauzuli operatora (takiej jak PIVOT lub UNPIVOT), zwracana jest wymagana table_alias na końcu klauzuli jest skojarzoną nazwą tabeli dla wszystkich kolumn, w tym kolumn grupowania.
WITH (<table_hint> )
Określa, że optymalizator zapytań używa strategii optymalizacji lub blokowania w tej tabeli i dla tej instrukcji. Aby uzyskać więcej informacji, zobacz Wskazówki dotyczące tabel (Transact-SQL).
rowset_function
Dotyczy: SQL Server i SQL Database.
Określa jedną z funkcji zestawu wierszy, taką jak OPENROWSET, która zwraca obiekt, którego można użyć zamiast odwołania do tabeli. Aby uzyskać więcej informacji na temat listy funkcji zestawu wierszy, zobacz funkcje zestawu wierszy (Transact-SQL).
Korzystanie z funkcji OPENROWSET i OPENQUERY w celu określenia obiektu zdalnego zależy od możliwości dostawcy OLE DB, który uzyskuje dostęp do obiektu.
bulk_column_alias
Dotyczy: SQL Server i SQL Database.
Opcjonalny alias zastępujący nazwę kolumny w zestawie wyników. Aliasy kolumn są dozwolone tylko w instrukcjach SELECT, które używają funkcji OPENROWSET z opcją BULK. W przypadku używania bulk_column_aliasokreśl alias dla każdej kolumny tabeli w tej samej kolejności co kolumny w pliku.
Nuta
Ten alias zastępuje atrybut NAME w elementach KOLUMNy pliku formatu XML, jeśli jest obecny.
user_defined_function
Określa funkcję wartości tabeli.
<openxml_clause> OPENXML
Dotyczy: SQL Server i SQL Database.
Udostępnia widok zestawu wierszy dla dokumentu XML. Aby uzyskać więcej informacji, zobacz OPENXML (Transact-SQL).
derived_table
Podzapytywanie pobierające wiersze z bazy danych. derived_table jest używany jako dane wejściowe zapytania zewnętrznego.
derived_table może użyć funkcji konstruktora wartości tabeli Transact-SQL do określenia wielu wierszy. Na przykład SELECT * FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);
. Aby uzyskać więcej informacji, zobacz Konstruktor wartości tabeli (Transact-SQL).
column_alias
Opcjonalny alias zastępujący nazwę kolumny w zestawie wyników tabeli pochodnej. Uwzględnij jeden alias kolumny dla każdej kolumny na liście wyboru i dołącz pełną listę aliasów kolumn w nawiasach.
table_or_view_name DLA SYSTEM_TIME <system_time>
Dotyczy: SQL Server 2016 (13.x) i nowsze wersje oraz SQL Database.
Określa, że określona wersja danych jest zwracana z określonej tabeli czasowej i połączonej tabeli historii o wersji systemu
TABLESAMPLE, klauzula
Dotyczy: sql Server, SQL Database i dedykowane pule SQL usługi Azure Synapse Analytics
Określa, że zwracana jest próbka danych z tabeli. Próbka może być przybliżona. Tej klauzuli można używać w dowolnej tabeli podstawowej lub połączonej w instrukcji SELECT lub UPDATE. Nie można określić tabelAMPLE z widokami.
Nuta
W przypadku używania funkcji TABLESAMPLE względem baz danych uaktualnionych do programu SQL Server poziom zgodności bazy danych jest ustawiony na 110 lub nowszy, funkcja PIVOT nie jest dozwolona w cyklicznym zapytaniu wspólnego wyrażenia tabeli (CTE). Aby uzyskać więcej informacji, zobacz ALTER DATABASE Compatibility Level (Transact-SQL).
SYSTEM
Metoda próbkowania zależna od implementacji określona przez standardy ISO. W programie SQL Server jest to jedyna dostępna metoda próbkowania i jest stosowana domyślnie. SYSTEM stosuje metodę próbkowania opartą na stronach, w której jest wybierany losowy zestaw stron z tabeli dla przykładu, a wszystkie wiersze na tych stronach są zwracane jako przykładowy podzestaw.
sample_number
Dokładne lub przybliżone stałe wyrażenie liczbowe reprezentujące procent lub liczbę wierszy. Po określeniu wartości PERCENT
PROCENT
Określa, że należy pobrać z tabeli sample_number procent wierszy tabeli. Gdy wartość PERCENT jest określona, program SQL Server zwraca przybliżony procent określony. Gdy wartość PERCENT jest określona, wyrażenie sample_number musi mieć wartość z zakresu od 0 do 100.
WIERSZY
Określa, że są pobierane około sample_number wierszy. Po określeniu wierszy program SQL Server zwraca przybliżenie liczby określonych wierszy. Po określeniu wierszy wyrażenie sample_number musi mieć wartość całkowitą większą niż zero.
POWTARZALNE
Wskazuje, że wybrana próbka może zostać zwrócona ponownie. Po określeniu tej samej wartości repeat_seed program SQL Server zwraca ten sam podzestaw wierszy, o ile nie wprowadzono żadnych zmian w wierszach w tabeli. Po określeniu innej wartości repeat_seed program SQL Server prawdopodobnie zwróci kilka różnych przykładów wierszy w tabeli. Następujące akcje tabeli są traktowane jako zmiany: wstawianie, aktualizowanie, usuwanie, ponowne kompilowanie indeksu lub defragmentacja oraz przywracanie lub dołączanie bazy danych.
repeat_seed
Stałe wyrażenie całkowite używane przez program SQL Server do generowania liczby losowej. repeat_seed jest bigint. Jeśli nie określono repeat_seed, program SQL Server przypisuje wartość losowo. W przypadku określonej wartości repeat_seed wynik próbkowania jest zawsze taki sam, jeśli do tabeli nie zastosowano żadnych zmian. Wyrażenie repeat_seed musi zostać obliczone na liczbę całkowitą większą niż zero.
Tabela sprzężona
Tabela sprzężona to zestaw wyników, który jest produktem co najmniej dwóch tabel. W przypadku wielu sprzężeń użyj nawiasów, aby zmienić naturalną kolejność sprzężeń.
Typ sprzężenia
Określa typ operacji sprzężenia.
WEWNĘTRZNY
Określa zwracane są wszystkie pasujące pary wierszy. Odrzuca niedopasowane wiersze z obu tabel. Jeśli nie określono żadnego typu sprzężenia, jest to ustawienie domyślne.
FULL [ OUTER ]
Określa, że wiersz z lewej lub prawej tabeli, który nie spełnia warunku sprzężenia, jest uwzględniony w zestawie wyników, a kolumny wyjściowe odpowiadające drugiej tabeli są ustawione na wartość NULL. Jest to dodatek do wszystkich wierszy zwykle zwracanych przez SPRZĘŻENIE WEWNĘTRZNE.
LEWA [ ZEWNĘTRZNA ]
Określa, że wszystkie wiersze z tabeli po lewej stronie nie spełniające warunku sprzężenia są uwzględnione w zestawie wyników, a kolumny wyjściowe z innej tabeli są ustawione na wartość NULL oprócz wszystkich wierszy zwracanych przez sprzężenie wewnętrzne.
PRAWO [ ZEWNĘTRZNE ]
Określa wszystkie wiersze z prawej tabeli, które nie spełniają warunku sprzężenia, są uwzględnione w zestawie wyników, a kolumny wyjściowe odpowiadające drugiej tabeli są ustawione na wartość NULL, oprócz wszystkich wierszy zwracanych przez sprzężenie wewnętrzne.
Wskazówka sprzężenia
W przypadku programu SQL Server i usługi SQL Database określa, że optymalizator zapytań programu SQL Server używa jednej wskazówki sprzężenia lub algorytmu wykonywania określonego w klauzuli FROM zapytania. Aby uzyskać więcej informacji, zobacz wskazówki dotyczące dołączania (Transact-SQL).
W przypadku usług Azure Synapse Analytics i Analytics Platform System (PDW) te wskazówki dotyczące sprzężeń mają zastosowanie do sprzężeń WEWNĘTRZNY w dwóch niezgodnych kolumnach dystrybucji. Mogą one poprawić wydajność zapytań, ograniczając ilość przenoszenia danych, która występuje podczas przetwarzania zapytań. Wskazówki dotyczące dołączania dozwolonego dla usług Azure Synapse Analytics i Analytics Platform System (PDW) są następujące:
ZMNIEJSZYĆ
Zmniejsza liczbę wierszy do przeniesienia dla tabeli po prawej stronie sprzężenia w celu zapewnienia zgodności dwóch rozkładów niezgodnych tabel. Wskazówka REDUCE jest również nazywana wskazówką półsprzężenia.
SYMULOWAĆ
Powoduje replikowanie wartości w kolumnie sprzęgania z tabeli po prawej stronie sprzężenia do wszystkich węzłów. Tabela po lewej stronie jest przyłączona do replikowanej wersji tych kolumn.
REDYSTRYBUOWAĆ
Wymusza dystrybucję dwóch źródeł danych na kolumnach określonych w klauzuli JOIN. W przypadku tabeli rozproszonej system platformy analizy (PDW) wykonuje przenoszenie mieszania. W przypadku replikowanej tabeli system platformy analizy (PDW) wykonuje przenoszenie przycinania. Aby zrozumieć te typy przenoszenia, zobacz sekcję "Operacje planu zapytań DMS" w artykule "Understanding Query Plans" (Opis planów zapytań) w dokumentacji produktu Analytics Platform System (PDW). Ta wskazówka może zwiększyć wydajność, gdy plan zapytania korzysta z przenoszenia emisji w celu rozwiązania niezgodnego sprzężenia dystrybucji.
DOŁĄCZYĆ
Wskazuje, że określona operacja sprzężenia powinna wystąpić między określonymi źródłami tabeli lub widokami.
ON <search_condition>
Określa warunek, na którym opiera się sprzężenia. Warunek może określać dowolny predykat, chociaż kolumny i operatory porównania są często używane, na przykład:
SELECT p.ProductID,
v.BusinessEntityID
FROM Production.Product AS p
INNER JOIN Purchasing.ProductVendor AS v
ON (p.ProductID = v.ProductID);
Gdy warunek określa kolumny, kolumny nie muszą mieć takiej samej nazwy ani tego samego typu danych; jednak jeśli typy danych nie są takie same, muszą być zgodne lub typy, które program SQL Server może niejawnie konwertować. Jeśli typy danych nie mogą być konwertowane niejawnie, warunek musi jawnie przekonwertować typ danych przy użyciu funkcji CONVERT.
Mogą istnieć predykaty, które obejmują tylko jedną ze sprzężonych tabel w klauzuli ON. Takie predykaty mogą również znajdować się w klauzuli WHERE w zapytaniu. Chociaż umieszczanie takich predykatów nie ma znaczenia dla sprzężeń WEWNĘTRZNY, może to spowodować inny wynik, gdy są zaangażowane sprzężenia ZEWNĘTRZNE. Wynika to z faktu, że predykaty w klauzuli ON są stosowane do tabeli przed sprzężenia, podczas gdy klauzula WHERE jest semantycznie stosowana do wyniku sprzężenia.
Aby uzyskać więcej informacji na temat warunków wyszukiwania i predykatów, zobacz Warunek wyszukiwania (Transact-SQL).
SPRZĘŻENIA KRZYŻOWE
Określa krzyżowy produkt dwóch tabel. Zwraca te same wiersze, co w przypadku, gdy nie określono klauzuli WHERE w starym stylu, sprzężenie innej niż SQL-92.
left_table_source { CROSS | ZEWNĘTRZNE } ZASTOSUJ right_table_source
Określa, że right_table_source operatora APPLY jest obliczany względem każdego wiersza left_table_source. Ta funkcja jest przydatna, gdy right_table_source zawiera funkcję wartości tabeli, która przyjmuje wartości kolumn z left_table_source jako jeden z jego argumentów.
Należy określić wartość CROSS lub OUTER z zastosowaniem. Po określeniu parametru CROSS nie są generowane żadne wiersze, gdy right_table_source jest obliczana względem określonego wiersza left_table_source i zwraca pusty zestaw wyników.
Po określeniu parametru OUTER jest generowany jeden wiersz dla każdego wiersza left_table_source nawet wtedy, gdy right_table_source oblicza względem tego wiersza i zwraca pusty zestaw wyników.
Aby uzyskać więcej informacji, zobacz sekcję Uwagi.
left_table_source
Źródło tabeli zdefiniowane w poprzednim argumencie. Aby uzyskać więcej informacji, zobacz sekcję Uwagi.
right_table_source
Źródło tabeli zdefiniowane w poprzednim argumencie. Aby uzyskać więcej informacji, zobacz sekcję Uwagi.
Klauzula PIVOT
<pivot_clause> przestawnych table_source
Określa, że table_source jest przestawiana na podstawie pivot_column. table_source jest wyrażeniem tabeli lub tabeli. Dane wyjściowe to tabela zawierająca wszystkie kolumny table_source z wyjątkiem pivot_column i value_column. Kolumny table_source, z wyjątkiem pivot_column i value_column, są nazywane kolumnami grupowania operatora przestawnego. Aby uzyskać więcej informacji o PIVOT i UNPIVOT, zobacz Using PIVOT and UNPIVOT.
Funkcja PIVOT wykonuje operację grupowania w tabeli wejściowej w odniesieniu do kolumn grupowania i zwraca jeden wiersz dla każdej grupy. Ponadto dane wyjściowe zawierają jedną kolumnę dla każdej wartości określonej w column_list, która jest wyświetlana w pivot_columninput_table.
Aby uzyskać więcej informacji, zobacz następującą sekcję Uwagi.
aggregate_function
Funkcja agregacji zdefiniowana przez system lub użytkownika, która akceptuje co najmniej jeden element wejściowy. Funkcja agregacji powinna być niezmienna do wartości null. Funkcja agregacji niezmienna na wartości null nie uwzględnia wartości null w grupie podczas obliczania wartości zagregowanej.
Funkcja agregacji systemu COUNT(*) nie jest dozwolona.
value_column
Kolumna wartości operatora PIVOT. W przypadku użycia z funkcją UNPIVOT value_column nie może być nazwą istniejącej kolumny w danych wejściowych table_source.
FOR pivot_column
Kolumna przestawna operatora PIVOT. pivot_column musi być typu niejawnie lub jawnie konwertowany na nvarchar(). Tej kolumny nie można obrazu ani rowversion.
Gdy jest używany element UNPIVOT, pivot_column jest nazwą kolumny wyjściowej, która staje się zawężona z table_source. Nie można mieć istniejącej kolumny w table_source o tej nazwie.
IN ( column_list )
W klauzuli PIVOT wyświetla wartości w pivot_column, które stają się nazwami kolumn tabeli wyjściowej. Lista nie może określić żadnych nazw kolumn, które już istnieją w table_source wejściowych, które są przestawiane.
W klauzuli UNPIVOT wyświetla kolumny w table_source, które są zawężone do pojedynczego pivot_column.
table_alias
Nazwa aliasu tabeli wyjściowej. pivot_table_alias należy określić.
<UNPIVOT_CLAUSE> UNPIVOT
Określa, że tabela wejściowa jest zawężona z wielu kolumn w column_list do jednej kolumny o nazwie pivot_column. Aby uzyskać więcej informacji o PIVOT i UNPIVOT, zobacz Using PIVOT and UNPIVOT.
OD <date_time>
Dotyczy: SQL Server 2016 (13.x) i nowsze wersje oraz SQL Database.
Zwraca tabelę z pojedynczym rekordem dla każdego wiersza zawierającego wartości rzeczywiste (bieżące) w określonym punkcie w czasie w przeszłości. Wewnętrznie związek jest wykonywany między tabelą czasową a tabelą historii a wynikami, aby zwrócić wartości w wierszu, który był prawidłowy w momencie określonym przez parametr <date_time>. Wartość wiersza jest uważana za prawidłową, jeśli wartość system_start_time_column_name jest mniejsza lub równa wartości parametru <date_time>, a wartość system_end_time_column_name jest większa niż wartość parametru <date_time>.
OD <start_date_time> DO <end_date_time>
Dotyczy: SQL Server 2016 (13.x) i nowsze wersje oraz SQL Database.
Zwraca tabelę z wartościami dla wszystkich wersji rekordów, które były aktywne w określonym zakresie czasu, niezależnie od tego, czy zaczęły być aktywne przed wartością parametru <start_date_time> argumentu FROM lub przestały być aktywne po <end_date_time> wartość parametru dla argumentu TO. Wewnętrznie jest wykonywana unia między tabelą czasową a tabelą historii, a wyniki są filtrowane w celu zwrócenia wartości dla wszystkich wersji wierszy, które były aktywne w dowolnym momencie w określonym zakresie czasu. Wiersze, które stały się aktywne dokładnie na dolnej granicy zdefiniowanej przez punkt końcowy FROM, są uwzględniane, a wiersze, które stały się aktywne dokładnie na górnej granicy zdefiniowanej przez punkt końcowy TO, nie są uwzględniane.
MIĘDZY <start_date_time> A <end_date_time>
Dotyczy: SQL Server 2016 (13.x) i nowsze wersje oraz SQL Database.
Tak samo jak powyżej w FROM <start_date_time> TO <end_date_time> description, z wyjątkiem wierszy, które stały się aktywne na górnej granicy zdefiniowanej przez punkt końcowy <end_date_time>.
ZAWARTE W (<start_date_time> , <end_date_time>)
Dotyczy: SQL Server 2016 (13.x) i nowsze wersje oraz SQL Database.
Zwraca tabelę z wartościami dla wszystkich wersji rekordów, które zostały otwarte i zamknięte w określonym zakresie czasu zdefiniowanym przez dwie wartości daty/godziny dla argumentu ZAWARTE W. Uwzględniane są wiersze, które stały się aktywne dokładnie na dolnej granicy lub przestały być aktywne dokładnie na górnej granicy.
CAŁY
Zwraca tabelę z wartościami ze wszystkich wierszy zarówno z bieżącej tabeli, jak i tabeli historii.
Uwagi
Klauzula FROM obsługuje składnię SQL-92 dla tabel sprzężonych i tabel pochodnych. Składnia SQL-92 udostępnia operatory INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER i CROSS join.
Klauzula UNION i JOIN w klauzuli FROM jest obsługiwana w widokach oraz w tabelach pochodnych i podzapytach.
Samosprzężenie to tabela, która jest przyłączona do siebie. Operacje wstawiania lub aktualizowania oparte na samosprzężeniu są zgodne z kolejnością w klauzuli FROM.
Ponieważ program SQL Server uwzględnia statystyki dystrybucji i kardynalności z serwerów połączonych, które zapewniają statystyki dystrybucji kolumn, wskazówka sprzężenia zdalnego nie jest wymagana do zdalnego oceniania sprzężenia. Procesor zapytań programu SQL Server uwzględnia statystyki zdalne i określa, czy strategia łączenia zdalnego jest odpowiednia. Wskazówka dotycząca sprzężenia zdalnego jest przydatna dla dostawców, którzy nie udostępniają statystyk dystrybucji kolumn.
Korzystanie z funkcji APPLY
Zarówno lewe, jak i prawe operandy operatora APPLY to wyrażenia tabeli. Główną różnicą między tymi operandami jest to, że right_table_source może użyć funkcji wartości tabeli, która przyjmuje kolumnę z left_table_source jako jeden z argumentów funkcji. left_table_source może zawierać funkcje wartości tabeli, ale nie może zawierać argumentów, które są kolumnami z right_table_source.
Operator APPLY działa w następujący sposób, aby utworzyć źródło tabeli dla klauzuli FROM:
Oblicza right_table_source względem każdego wiersza left_table_source w celu utworzenia zestawów wierszy.
Wartości w right_table_source zależą od left_table_source. right_table_source można przedstawić w przybliżeniu w ten sposób:
TVF(left_table_source.row)
, gdzieTVF
jest funkcją wartości tabeli.Łączy zestawy wyników tworzone dla każdego wiersza w ocenie right_table_source z left_table_source przez wykonanie operacji UNION ALL.
Lista kolumn wygenerowanych przez wynik operatora APPLY to zestaw kolumn z left_table_source połączony z listą kolumn z right_table_source.
Korzystanie z funkcji PIVOT i UNPIVOT
pivot_column i value_column grupują kolumny używane przez operator PIVOT. Funkcja PIVOT jest zgodna z następującym procesem w celu uzyskania wyjściowego zestawu wyników:
Wykonuje grupowanie według na input_table względem kolumn grupowania i tworzy jeden wiersz wyjściowy dla każdej grupy.
Grupowanie kolumn w wierszu danych wyjściowych uzyskuje odpowiednie wartości kolumn dla tej grupy w input_table.
Generuje wartości dla kolumn na liście kolumn dla każdego wiersza wyjściowego, wykonując następujące czynności:
Grupowanie dodatkowo wierszy wygenerowanych w usłudze GROUP BY w poprzednim kroku względem pivot_column.
Dla każdej kolumny danych wyjściowych w column_listwybierz podgrupę spełniającą warunek:
pivot_column = CONVERT(<data type of pivot_column>, 'output_column')
aggregate_function jest obliczana względem value_column w tej podgrupie, a jego wynik jest zwracany jako wartość odpowiadającego output_column. Jeśli podgrupa jest pusta, program SQL Server generuje wartość null dla tej output_column. Jeśli funkcja agregacji ma wartość COUNT, a podgrupa jest pusta, zwracana jest wartość zero (0).
Nuta
Identyfikatory kolumn w klauzuli UNPIVOT
są zgodne z sortowaniem wykazu. W przypadku usługi SQL Database sortowanie jest zawsze SQL_Latin1_General_CP1_CI_AS
. W przypadku częściowo zawartych baz danych programu SQL Server sortowanie jest zawsze Latin1_General_100_CI_AS_KS_WS_SC
. Jeśli kolumna jest połączona z innymi kolumnami, w celu uniknięcia konfliktów wymagana jest klauzula sortowania (COLLATE DATABASE_DEFAULT
).
Aby uzyskać więcej informacji o PIVOT i UNPIVOT, w tym przykłady, zobacz Using PIVOT and UNPIVOT.
Uprawnienia
Wymaga uprawnień do instrukcji DELETE, SELECT lub UPDATE.
Przykłady
A. Używanie klauzuli FROM
Poniższy przykład pobiera kolumny TerritoryID
i Name
z tabeli SalesTerritory
w przykładowej bazie danych AdventureWorks2022.
SELECT TerritoryID,
Name
FROM Sales.SalesTerritory
ORDER BY TerritoryID;
Oto zestaw wyników.
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. Używanie wskazówek optymalizatora TABLOCK i HOLDLOCK
Poniższa transakcja częściowa pokazuje, jak umieścić jawną blokadę udostępnionej tabeli na Employee
i jak odczytać indeks. Blokada jest przechowywana w całej transakcji.
BEGIN TRANSACTION
SELECT COUNT(*)
FROM HumanResources.Employee WITH (TABLOCK, HOLDLOCK);
C. Używanie składni SQL-92 CROSS JOIN
Poniższy przykład zwraca krzyżowy produkt dwóch tabel Employee
i Department
w bazie danych AdventureWorks2022. Zwracana jest lista wszystkich możliwych kombinacji wierszy BusinessEntityID
i wszystkich wierszy nazw 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. Używanie składni SQL-92 FULL OUTER JOIN
Poniższy przykład zwraca nazwę produktu i wszystkie odpowiadające im zamówienia sprzedaży w tabeli SalesOrderDetail
w bazie danych AdventureWorks2022. Zwraca również wszystkie zamówienia sprzedaży, które nie mają produktu wymienionego w tabeli Product
, oraz wszelkie produkty z zamówieniem sprzedaży innym niż wymienione w tabeli 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. Używanie składni SQL-92 LEFT OUTER JOIN
Poniższy przykład łączy dwie tabele na ProductID
i zachowuje niedopasowane wiersze z lewej tabeli. Tabela Product
jest dopasowywana do tabeli SalesOrderDetail
w kolumnach ProductID
w każdej tabeli. Wszystkie produkty, uporządkowane i nie uporządkowane, pojawiają się w zestawie wyników.
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. Używanie składni SQL-92 INNER JOIN
Poniższy przykład zwraca wszystkie nazwy produktów i identyfikatory zamówień sprzedaży.
-- 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. Używanie składni SQL-92 RIGHT OUTER JOIN
Poniższy przykład łączy dwie tabele na TerritoryID
i zachowuje niedopasowane wiersze z prawej tabeli. Tabela SalesTerritory
jest dopasowywana do tabeli SalesPerson
w kolumnie TerritoryID
w każdej tabeli. Wszyscy sprzedawcy są wyświetlani w zestawie wyników, niezależnie od tego, czy mają przypisane terytorium.
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. Używanie wskazówek dotyczących sprzężeń HASH i MERGE
Poniższy przykład wykonuje sprzężenie z trzema tabelami między tabelami Product
, ProductVendor
i Vendor
w celu utworzenia listy produktów i ich dostawców. Optymalizator zapytań łączy Product
i ProductVendor
(p
i pv
) przy użyciu sprzężenia MERGE. Następnie wyniki sprzężenia Product
i ProductVendor
MERGE (p
i pv
) są przyłączone do tabeli Vendor
w celu utworzenia (p
i pv
) oraz v
.
Ważny
Po określeniu wskazówki sprzężenia słowo kluczowe INNER nie jest już opcjonalne i musi być jawnie określone, aby można było wykonać sprzężenie wewnętrzne.
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;
Ja. Używanie tabeli pochodnej
W poniższym przykładzie użyto tabeli pochodnej, instrukcji SELECT
po klauzuli FROM
, aby zwrócić imię i nazwisko wszystkich pracowników i miast, w których mieszkają.
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. Odczytywanie danych z przykładu wierszy w tabeli przy użyciu metody TABLESAMPLE
W poniższym przykładzie użyto TABLESAMPLE
w klauzuli FROM
, aby zwrócić około 10
procent wszystkich wierszy w tabeli Customer
.
SELECT *
FROM Sales.Customer TABLESAMPLE SYSTEM(10 PERCENT);
K. Korzystanie z funkcji APPLY
W poniższym przykładzie przyjęto założenie, że w bazie danych istnieją następujące tabele i funkcja z wartością tabeli:
Nazwa obiektu | Nazwy kolumn |
---|---|
Działów | DeptID, DivisionID, DeptName, DeptMgrID |
EmpMgr | MgrID, EmpID |
Pracowników | EmpID, EmpLastName, EmpFirstName, EmpSalary |
GetReports(MgrID) | EmpID, EmpLastName, EmpSalary |
Funkcja GetReports
wartości tabeli zwraca listę wszystkich pracowników, którzy zgłaszają bezpośrednio lub pośrednio określony MgrID
.
W tym przykładzie użyto APPLY
do zwrócenia wszystkich działów i wszystkich pracowników w tym dziale. Jeśli określony dział nie ma żadnych pracowników, nie będą zwracane żadne wiersze dla tego działu.
SELECT DeptID,
DeptName,
DeptMgrID,
EmpID,
EmpLastName,
EmpSalary
FROM Departments d
CROSS APPLY dbo.GetReports(d.DeptMgrID);
Jeśli chcesz, aby zapytanie tworzyło wiersze dla tych działów bez pracowników, co spowoduje wygenerowanie wartości null dla kolumn EmpID
, EmpLastName
i EmpSalary
, użyj OUTER APPLY
.
SELECT DeptID,
DeptName,
DeptMgrID,
EmpID,
EmpLastName,
EmpSalary
FROM Departments d
OUTER APPLY dbo.GetReports(d.DeptMgrID);
L. Korzystanie z FUNKCJI CROSS APPLY
Poniższy przykład pobiera migawkę wszystkich planów zapytań znajdujących się w pamięci podręcznej planu, wysyłając zapytanie do sys.dm_exec_cached_plans
dynamiczny widok zarządzania, aby pobrać dojścia planu wszystkich planów zapytań w pamięci podręcznej. Następnie określono operator CROSS APPLY
, aby przekazać dojścia planu do sys.dm_exec_query_plan
. Dane wyjściowe programu Showplan XML dla każdego planu aktualnie w pamięci podręcznej planu znajduje się w kolumnie query_plan
tabeli, która jest zwracana.
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. Używanie funkcji FOR SYSTEM_TIME
Dotyczy: SQL Server 2016 (13.x) i nowsze wersje oraz SQL Database.
W poniższym przykładzie użyto argumentu FOR SYSTEM_TIME AS OF date_time_literal_or_variable, aby zwrócić wiersze tabeli, które były rzeczywiste (bieżące) od 1 stycznia 2014 r.
SELECT DepartmentNumber,
DepartmentName,
ManagerID,
ParentDepartmentNumber
FROM DEPARTMENT
FOR SYSTEM_TIME AS OF '2014-01-01'
WHERE ManagerID = 5;
W poniższym przykładzie użyto argumentu FOR SYSTEM_TIME FROM date_time_literal_or_variable TO date_time_literal_or_variable, aby zwrócić wszystkie wiersze, które były aktywne w okresie zdefiniowanym od 1 stycznia 2013 r. i kończące się 1 stycznia 2014 r., poza górną granicą.
SELECT DepartmentNumber,
DepartmentName,
ManagerID,
ParentDepartmentNumber
FROM DEPARTMENT
FOR SYSTEM_TIME FROM '2013-01-01' TO '2014-01-01'
WHERE ManagerID = 5;
W poniższym przykładzie użyto argumentu FOR SYSTEM_TIME BETWEEN date_time_literal_or_variable AND and date_time_literal_or_variable, aby zwrócić wszystkie wiersze aktywne w okresie zdefiniowanym od 1 stycznia 2013 r. i kończące się 1 stycznia 2014 r. włącznie z górną granicą.
SELECT DepartmentNumber,
DepartmentName,
ManagerID,
ParentDepartmentNumber
FROM DEPARTMENT
FOR SYSTEM_TIME BETWEEN '2013-01-01' AND '2014-01-01'
WHERE ManagerID = 5;
W poniższym przykładzie użyto argumentu FOR SYSTEM_TIME ZAWARTE W (date_time_literal_or_variable, date_time_literal_or_variable) w celu zwrócenia wszystkich wierszy, które zostały otwarte i zamknięte w okresie zdefiniowanym od 1 stycznia 2013 r. i kończącym się 1 stycznia 2014 r.
SELECT DepartmentNumber,
DepartmentName,
ManagerID,
ParentDepartmentNumber
FROM DEPARTMENT
FOR SYSTEM_TIME CONTAINED IN ('2013-01-01', '2014-01-01')
WHERE ManagerID = 5;
W poniższym przykładzie użyto zmiennej, a nie literału, aby podać wartości granic daty dla zapytania.
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;
Przykłady: Azure Synapse Analytics and Analytics Platform System (PDW)
N. Korzystanie ze składni INNER JOIN
Poniższy przykład zwraca kolumny SalesOrderNumber
, ProductKey
i EnglishProductName
z tabel FactInternetSales
i DimProduct
, w których klucz sprzężenia, ProductKey
, pasuje do obu tabel. Kolumny SalesOrderNumber
i EnglishProductName
istnieją tylko w jednej z tabel, więc nie trzeba określać aliasu tabeli z tymi kolumnami, jak pokazano; te aliasy są uwzględniane w celu zapewnienia czytelności. Słowo AS przed nazwą aliasu nie jest wymagane, ale jest zalecane do czytelności i zgodności ze standardem ANSI.
-- Uses AdventureWorks
SELECT fis.SalesOrderNumber,
dp.ProductKey,
dp.EnglishProductName
FROM FactInternetSales AS fis
INNER JOIN DimProduct AS dp
ON dp.ProductKey = fis.ProductKey;
Ponieważ słowo kluczowe INNER
nie jest wymagane dla sprzężeń wewnętrznych, to samo zapytanie może być napisane jako:
-- Uses AdventureWorks
SELECT fis.SalesOrderNumber,
dp.ProductKey,
dp.EnglishProductName
FROM FactInternetSales AS fis
INNER JOIN DimProduct AS dp
ON dp.ProductKey = fis.ProductKey;
Klauzula WHERE
może być również używana z tym zapytaniem w celu ograniczenia wyników. Ten przykład ogranicza wyniki do SalesOrderNumber
wartości wyższych niż "SO5000":
-- 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;
O. Używanie składni LEFT OUTER JOIN i RIGHT OUTER JOIN
Poniższy przykład łączy tabele FactInternetSales
i DimProduct
w kolumnach ProductKey
. Lewa składnia sprzężenia zewnętrznego zachowuje niedopasowane wiersze z lewej (FactInternetSales
) tabeli. Ponieważ tabela FactInternetSales
nie zawiera żadnych wartości ProductKey
, które nie są zgodne z tabelą DimProduct
, to zapytanie zwraca te same wiersze co pierwszy przykład sprzężenia wewnętrznego we wcześniejszej części tego artykułu.
-- Uses AdventureWorks
SELECT fis.SalesOrderNumber,
dp.ProductKey,
dp.EnglishProductName
FROM FactInternetSales AS fis
LEFT OUTER JOIN DimProduct AS dp
ON dp.ProductKey = fis.ProductKey;
To zapytanie można również napisać bez słowa kluczowego OUTER
.
W prawych sprzężeniach zewnętrznych niepasowane wiersze z prawej tabeli są zachowywane. Poniższy przykład zwraca te same wiersze co przykład lewego sprzężenia zewnętrznego powyżej.
-- Uses AdventureWorks
SELECT fis.SalesOrderNumber,
dp.ProductKey,
dp.EnglishProductName
FROM DimProduct AS dp
RIGHT OUTER JOIN FactInternetSales AS fis
ON dp.ProductKey = fis.ProductKey;
Poniższe zapytanie używa tabeli DimSalesTerritory
jako lewej tabeli w lewym sprzężeniu zewnętrznym. Pobiera ona wartości SalesOrderNumber
z tabeli FactInternetSales
. Jeśli nie ma zamówień dla określonego SalesTerritoryKey
, zapytanie zwraca wartość NULL dla SalesOrderNumber
dla tego wiersza. To zapytanie jest uporządkowane według kolumny SalesOrderNumber
, aby wszystkie listy NUL w tej kolumnie pojawiały się w górnej części wyników.
-- 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;
To zapytanie może zostać przepisane przy użyciu prawego sprzężenia zewnętrznego, aby pobrać te same wyniki:
-- 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. Używanie składni FULL OUTER JOIN
W poniższym przykładzie pokazano pełne sprzężenie zewnętrzne, które zwraca wszystkie wiersze z obu tabel sprzężonych, ale zwraca wartość NULL dla wartości, które nie są zgodne z inną tabelą.
-- 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;
To zapytanie można również napisać bez słowa kluczowego 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;
Q. Używanie składni CROSS JOIN
Poniższy przykład zwraca krzyżowy produkt tabel FactInternetSales
i DimSalesTerritory
. Zwracana jest lista wszystkich możliwych kombinacji SalesOrderNumber
i SalesTerritoryKey
. Zwróć uwagę na brak klauzuli ON
w zapytaniu sprzężenia krzyżowego.
-- Uses AdventureWorks
SELECT dst.SalesTerritoryKey,
fis.SalesOrderNumber
FROM DimSalesTerritory AS dst
CROSS JOIN FactInternetSales AS fis
ORDER BY fis.SalesOrderNumber;
R. Używanie tabeli pochodnej
W poniższym przykładzie użyto tabeli pochodnej (instrukcji SELECT
po klauzuli FROM
), aby zwrócić kolumny CustomerKey
i LastName
wszystkich klientów w tabeli DimCustomer
z wartościami BirthDate
później niż 1 stycznia 1970 r. i nazwisko "Smith".
-- Uses AdventureWorks
SELECT CustomerKey,
LastName
FROM (
SELECT *
FROM DimCustomer
WHERE BirthDate > '01/01/1970'
) AS DimCustomerDerivedTable
WHERE LastName = 'Smith'
ORDER BY LastName;
S. Przykład wskazówki dotyczącej sprzężenia REDUKCJI
W poniższym przykładzie użyto wskazówki REDUCE
sprzężenia w celu zmiany przetwarzania tabeli pochodnej w zapytaniu. W przypadku korzystania z wskazówki REDUCE
sprzężenia w tym zapytaniu fis.ProductKey
jest projektowana, replikowana i unikatowa, a następnie przyłączona do DimProduct
podczas mieszania DimProduct
w ProductKey
. Wynikowa tabela pochodna jest dystrybuowana na 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;
T. Przykład wskazówki dotyczącej sprzężenia REPLIK
W następnym przykładzie pokazano to samo zapytanie co w poprzednim przykładzie, z tą różnicą, że użyto wskazówki REPLICATE
sprzężenia zamiast wskazówki REDUCE
sprzężenia. Użycie wskazówki REPLICATE
powoduje replikowanie wartości w kolumnie ProductKey
(sprzęganie) z tabeli FactInternetSales
do wszystkich węzłów. Tabela DimProduct
jest przyłączona do replikowanej wersji tych wartości.
-- 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;
U. Użyj wskazówki redystrybucji, aby zagwarantować przenoszenie mieszania dla niezgodnego sprzężenia dystrybucji
Poniższe zapytanie używa wskazówek zapytania REDISTRIBUTE w przypadku niezgodnego sprzężenia dystrybucji. Gwarantuje to, że optymalizator zapytań korzysta z przenoszenia mieszania w planie zapytania. Gwarantuje to również, że plan zapytania nie będzie używać przenoszenia emisji, który przenosi tabelę rozproszoną do zreplikowanej tabeli.
W poniższym przykładzie wskazówka REDISTRIBUTE wymusza przejście shuffle w tabeli FactInternetSales, ponieważ ProductKey jest kolumną dystrybucji DimProduct i nie jest kolumną dystrybucji 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. Odczytywanie danych z przykładu wierszy w tabeli przy użyciu metody TABLESAMPLE
W poniższym przykładzie użyto TABLESAMPLE
w klauzuli FROM
, aby zwrócić około 10
procent wszystkich wierszy w tabeli Customer
.
SELECT *
FROM Sales.Customer TABLESAMPLE SYSTEM(10 PERCENT);