Delen via


FROM-component plus JOIN, APPLY, PIVOT (Transact-SQL)

van toepassing op: SQL Server 2016 (13.x) en latere versies Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricWarehouse in Microsoft FabricSQL-database in Microsoft Fabric

In Transact-SQL is de FROM-component beschikbaar op de volgende instructies:

De FROM-component is meestal vereist voor de SELECT-instructie. De uitzondering is wanneer er geen tabelkolommen worden weergegeven en de enige items in de lijst letterlijke of variabelen of rekenkundige expressies zijn.

In dit artikel worden ook de volgende trefwoorden besproken die kunnen worden gebruikt voor de FROM-component:

Transact-SQL syntaxisconventies

Syntaxis

Syntaxis voor SQL Server, Azure SQL Database en Fabric 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

Syntaxis voor parallel datawarehouse, 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

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

Argumenten

<table_source>

Hiermee geeft u een tabel, weergave, tabelvariabele of afgeleide tabelbron, met of zonder alias, op in de instructie Transact-SQL. Er kunnen maximaal 256 tabelbronnen worden gebruikt in een instructie, hoewel de limiet afhankelijk is van het beschikbare geheugen en de complexiteit van andere expressies in de query. Afzonderlijke query's bieden mogelijk geen ondersteuning voor maximaal 256 tabelbronnen.

Notitie

Queryprestaties kunnen leiden tot een groot aantal tabellen waarnaar wordt verwezen in een query. Compilatie- en optimalisatietijd wordt ook beïnvloed door aanvullende factoren. Deze omvatten de aanwezigheid van indexen en geïndexeerde weergaven op elke <table_source> en de grootte van de <select_list> in de SELECT-instructie.

De volgorde van tabelbronnen na het trefwoord FROM heeft geen invloed op de resultatenset die wordt geretourneerd. SQL Server retourneert fouten wanneer dubbele namen worden weergegeven in de FROM-component.

table_or_view_name

De naam van een tabel of weergave.

Als de tabel of weergave bestaat in een andere database op hetzelfde exemplaar van SQL Server, gebruikt u een volledig gekwalificeerde naam in het formulier database.schema.object_name.

Als de tabel of weergave buiten het exemplaar van SQL Serverl bestaat, gebruikt u een vierdelige naam in het formulier linked_server.catalogus.schema.object. Zie sp_addlinkedserver (Transact-SQL)voor meer informatie. Een vierdelige naam die is samengesteld met behulp van de functie OPENDATASOURCE als serveronderdeel van de naam kan ook worden gebruikt om de externe tabelbron op te geven. Wanneer OPENDATASOURCE is opgegeven, zijn database_name en schema_name mogelijk niet van toepassing op alle gegevensbronnen en zijn ze onderworpen aan de mogelijkheden van de OLE DB-provider die toegang heeft tot het externe object.

[AS] table_alias

Een alias voor table_source die voor het gemak kunnen worden gebruikt of om een tabel of weergave te onderscheiden in een self-join of subquery. Een alias is vaak een verkorte tabelnaam die wordt gebruikt om te verwijzen naar specifieke kolommen van de tabellen in een join. Als dezelfde kolomnaam bestaat in meer dan één tabel in de join, kan sql Server vereisen dat de kolomnaam wordt gekwalificeerd door een tabelnaam, weergavenaam of alias om deze kolommen te onderscheiden. De tabelnaam kan niet worden gebruikt als er een alias is gedefinieerd.

Wanneer een afgeleide tabel, rijset of tabelwaardefunctie of operatorcomponent (zoals PIVOT of UNPIVOT) wordt gebruikt, is de vereiste table_alias aan het einde van de component de bijbehorende tabelnaam voor alle kolommen, inclusief groeperingskolommen, geretourneerd.

WITH (<table_hint> )

Hiermee geeft u op dat de queryoptimalisatie een optimalisatie- of vergrendelingsstrategie gebruikt met deze tabel en voor deze instructie. Zie tabelhints (Transact-SQL)voor meer informatie.

rowset_function

is van toepassing op: SQL Server en SQL Database.

Hiermee geeft u een van de rijensetfuncties op, zoals OPENROWSET, die een object retourneert dat kan worden gebruikt in plaats van een tabelverwijzing. Zie Rowset Functions (Transact-SQL)voor meer informatie over een lijst met rijensetfuncties.

Het gebruik van de functies OPENROWSET en OPENQUERY om een extern object op te geven, is afhankelijk van de mogelijkheden van de OLE DB-provider die toegang heeft tot het object.

bulk_column_alias

is van toepassing op: SQL Server en SQL Database.

Een optionele alias om een kolomnaam in de resultatenset te vervangen. Kolomaliassen zijn alleen toegestaan in SELECT-instructies die gebruikmaken van de functie OPENROWSET met de optie BULK. Wanneer u bulk_column_aliasgebruikt, geeft u een alias op voor elke tabelkolom in dezelfde volgorde als de kolommen in het bestand.

Notitie

Deze alias overschrijft het kenmerk NAME in de KOLOM-elementen van een XML-indelingsbestand, indien aanwezig.

user_defined_function

Hiermee geeft u een tabelwaardefunctie.

OPENXML-<openxml_clause>

is van toepassing op: SQL Server en SQL Database.

Biedt een rijsetweergave over een XML-document. Zie OPENXML (Transact-SQL)voor meer informatie.

derived_table

Een subquery waarmee rijen uit de database worden opgehaald. derived_table wordt gebruikt als invoer voor de buitenste query.

derived_table kunt de constructorfunctie Transact-SQL tabelwaarde gebruiken om meerdere rijen op te geven. Bijvoorbeeld SELECT * FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);. Zie tabelwaardeconstructor (Transact-SQL)voor meer informatie.

column_alias

Een optionele alias om een kolomnaam te vervangen in de resultatenset van de afgeleide tabel. Neem één kolomalias op voor elke kolom in de selectielijst en plaats de volledige lijst met kolomaliassen tussen haakjes.

table_or_view_name FOR SYSTEM_TIME <system_time>

Van toepassing op: SQL Server 2016 (13.x) en latere versies en SQL Database.

Hiermee geeft u op dat een specifieke versie van gegevens wordt geretourneerd uit de opgegeven tijdelijke tabel en de gekoppelde systeemversie van de geschiedenistabel

TABLESAMPLE-component

van toepassing op: TOEGEWEZEN SQL Server-, SQL Database- en Azure Synapse Analytics-toegewezen SQL-pools

Hiermee geeft u op dat een voorbeeld van gegevens uit de tabel wordt geretourneerd. De steekproef kan bij benadering zijn. Deze component kan worden gebruikt voor elke primaire of gekoppelde tabel in een SELECT- of UPDATE-instructie. TABLESAMPLE kan niet worden opgegeven met weergaven.

Notitie

Wanneer u TABLESAMPLE gebruikt voor databases die zijn bijgewerkt naar SQL Server, is het compatibiliteitsniveau van de database ingesteld op 110 of hoger, is PIVOT niet toegestaan in een recursieve CTE-query (Common Table Expression). Zie ALTER DATABASE Compatibility Level (Transact-SQL)voor meer informatie.

SYSTEEM

Een implementatieafhankelijke steekproefmethode die is opgegeven door ISO-standaarden. In SQL Server is dit de enige beschikbare steekproefmethode en wordt standaard toegepast. SYSTEM past een steekproefmethode op basis van pagina's toe waarin een willekeurige set pagina's uit de tabel wordt gekozen voor het voorbeeld en alle rijen op die pagina's worden geretourneerd als de voorbeeldsubset.

sample_number

Een exacte of geschatte constante numerieke expressie die het percentage of het aantal rijen aangeeft. Wanneer deze is opgegeven met PERCENT, wordt sample_number impliciet geconverteerd naar een float- waarde; anders wordt het geconverteerd naar bigint. PERCENT is de standaardwaarde.

PROCENT

Hiermee geeft u op dat een sample_number percentage van de rijen van de tabel moet worden opgehaald uit de tabel. Wanneer PERCENT is opgegeven, retourneert SQL Server een geschatte waarde van het opgegeven percentage. Wanneer PERCENT is opgegeven, moet de sample_number-expressie resulteren in een waarde van 0 tot 100.

RIJEN

Hiermee geeft u op dat ongeveer sample_number rijen worden opgehaald. Wanneer ROWS is opgegeven, retourneert SQL Server een benadering van het aantal opgegeven rijen. Wanneer RIJEN is opgegeven, moet de sample_number-expressie een geheel getal groter dan nul opleveren.

HERHAALBARE

Geeft aan dat het geselecteerde voorbeeld opnieuw kan worden geretourneerd. Wanneer deze is opgegeven met dezelfde repeat_seed waarde, retourneert SQL Server dezelfde subset rijen zolang er geen wijzigingen zijn aangebracht in rijen in de tabel. Wanneer u een andere repeat_seed waarde opgeeft, retourneert SQL Server waarschijnlijk een ander voorbeeld van de rijen in de tabel. De volgende acties voor de tabel worden beschouwd als wijzigingen: invoegen, bijwerken, verwijderen, herbouwen of defragmenteren van de index en het herstellen of koppelen van databases.

repeat_seed

Een constante expressie voor gehele getallen die door SQL Server wordt gebruikt om een willekeurig getal te genereren. repeat_seed is grote. Als repeat_seed niet is opgegeven, wijst SQL Server een willekeurige waarde toe. Voor een specifieke repeat_seed waarde is het steekproefresultaat altijd hetzelfde als er geen wijzigingen zijn toegepast op de tabel. De repeat_seed-expressie moet resulteren in een geheel getal dat groter is dan nul.

Gekoppelde tabel

Een gekoppelde tabel is een resultatenset die het product is van twee of meer tabellen. Voor meerdere joins gebruikt u haakjes om de natuurlijke volgorde van de joins te wijzigen.

Jointype

Hiermee geeft u het type join-bewerking op.

BINNENSTE

Hiermee geeft u alle overeenkomende paren rijen worden geretourneerd. Verwijdert niet-overeenkomende rijen uit beide tabellen. Als er geen jointype is opgegeven, is dit de standaardinstelling.

FULL [ OUTER ]

Hiermee geeft u op dat een rij uit de linker- of rechtertabel die niet voldoet aan de joinvoorwaarde wordt opgenomen in de resultatenset en uitvoerkolommen die overeenkomen met de andere tabel zijn ingesteld op NULL. Dit is een aanvulling op alle rijen die doorgaans worden geretourneerd door INNER JOIN.

LINKS [ BUITENSTE ]

Hiermee geeft u op dat alle rijen uit de linkertabel die niet voldoen aan de joinvoorwaarde, worden opgenomen in de resultatenset en uitvoerkolommen uit de andere tabel worden ingesteld op NULL, naast alle rijen die door de inner join worden geretourneerd.

RECHTS [ OUTER ]

Hiermee geeft u alle rijen uit de rechtertabel die niet aan de joinvoorwaarde voldoen, worden opgenomen in de resultatenset en worden uitvoerkolommen die overeenkomen met de andere tabel ingesteld op NULL, naast alle rijen die door de inner join worden geretourneerd.

Hint voor deelname

Voor SQL Server en SQL Database geeft u aan dat de SQL Server-queryoptimalisatie één joinhint of uitvoeringsalgoritmen gebruikt, per join die is opgegeven in de query FROM-component. Zie Hints voor deelname (Transact-SQL)voor meer informatie.

Voor Azure Synapse Analytics en Analytics Platform System (PDW) zijn deze joinhints van toepassing op INNER joins op twee niet-compatibele kolommen voor distributies. Ze kunnen de queryprestaties verbeteren door de hoeveelheid gegevensverplaatsing te beperken die plaatsvindt tijdens het verwerken van query's. De toegestane joinhints voor Azure Synapse Analytics en Analytics Platform System (PDW) zijn als volgt:

REDUCEREN

Vermindert het aantal rijen dat moet worden verplaatst voor de tabel aan de rechterkant van de join om twee distributiecompatibele tabellen compatibel te maken. De HINT REDUCE wordt ook wel een semi-join-hint genoemd.

NABOOTSEN

Hiermee worden de waarden in de kolom samenvoegen vanuit de tabel aan de rechterkant van de join gerepliceerd naar alle knooppunten. De tabel aan de linkerkant is gekoppeld aan de gerepliceerde versie van deze kolommen.

HERVERDELEN

Hiermee worden twee gegevensbronnen gedwongen om te worden gedistribueerd op kolommen die zijn opgegeven in de JOIN-component. Voor een gedistribueerde tabel voert Analytics Platform System (PDW) een willekeurige verplaatsing uit. Voor een gerepliceerde tabel voert Analytics Platform System (PDW) een trim-verplaatsing uit. Als u deze verplaatsingstypen wilt begrijpen, raadpleegt u de sectie DMS-queryplanbewerkingen in het artikel 'Queryplannen begrijpen' in de productdocumentatie van Analytics Platform System (PDW). Deze hint kan de prestaties verbeteren wanneer het queryplan een broadcast-verplaatsing gebruikt om een distributiecompatibele join op te lossen.

VERBINDEN

Geeft aan dat de opgegeven join-bewerking moet plaatsvinden tussen de opgegeven tabelbronnen of weergaven.

OP <search_condition>

Hiermee geeft u de voorwaarde op waarop de join is gebaseerd. De voorwaarde kan elk predicaat opgeven, hoewel kolommen en vergelijkingsoperatoren vaak worden gebruikt, bijvoorbeeld:

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

Wanneer de voorwaarde kolommen opgeeft, hoeven de kolommen niet dezelfde naam of hetzelfde gegevenstype te hebben; Als de gegevenstypen echter niet hetzelfde zijn, moeten ze compatibel zijn of typen die SQL Server impliciet kan converteren. Als de gegevenstypen niet impliciet kunnen worden geconverteerd, moet de voorwaarde het gegevenstype expliciet converteren met behulp van de functie CONVERTEREN.

Er kunnen predicaten zijn die slechts één van de gekoppelde tabellen in de ON-component bevatten. Dergelijke predicaten kunnen zich ook in de WHERE-component in de query bevinden. Hoewel de plaatsing van dergelijke predicaten geen verschil maakt voor INNER joins, kunnen ze een ander resultaat veroorzaken wanneer OUTER joins betrokken zijn. Dit komt doordat de predicaten in de ON-component vóór de join worden toegepast op de tabel, terwijl de WHERE-component semantisch wordt toegepast op het resultaat van de join.

Zie Zoekvoorwaarde (Transact-SQL)voor meer informatie over zoekvoorwaarden en predicaten.

CROSS JOIN

Hiermee geeft u het kruisproduct van twee tabellen. Retourneert dezelfde rijen alsof er geen WHERE-component is opgegeven in een oude stijl, niet-SQL-92-stijl join.

left_table_source { CROSS | OUTER } APPLY right_table_source

Hiermee geeft u op dat de right_table_source van de operator APPLY wordt geëvalueerd op basis van elke rij van de left_table_source. Deze functionaliteit is handig wanneer de right_table_source een tabelwaardefunctie bevat die kolomwaarden uit de left_table_source als een van de argumenten gebruikt.

CROSS of OUTER moet worden opgegeven met APPLY. Wanneer CROSS is opgegeven, worden er geen rijen geproduceerd wanneer de right_table_source wordt geëvalueerd op basis van een opgegeven rij van de left_table_source en wordt een lege resultatenset geretourneerd.

Wanneer OUTER is opgegeven, wordt er één rij geproduceerd voor elke rij van de left_table_source, zelfs wanneer de right_table_source evalueert op basis van die rij en een lege resultatenset retourneert.

Zie de sectie Opmerkingen voor meer informatie.

left_table_source

Een tabelbron zoals gedefinieerd in het vorige argument. Zie de sectie Opmerkingen voor meer informatie.

right_table_source

Een tabelbron zoals gedefinieerd in het vorige argument. Zie de sectie Opmerkingen voor meer informatie.

PIVOT-component

table_source PIVOT-<pivot_clause>

Hiermee geeft u op dat de table_source wordt gepistemd op basis van de pivot_column. table_source is een tabel- of tabelexpressie. De uitvoer is een tabel die alle kolommen van de table_source bevat, met uitzondering van de pivot_column en value_column. De kolommen van de table_source, met uitzondering van de pivot_column en value_column, worden de groeperingskolommen van de draaioperator genoemd. Zie PIVOT- en UNPIVOT-gebruiken voor meer informatie over PIVOT en UNPIVOT.

PIVOT voert een groeperingsbewerking uit op de invoertabel met betrekking tot de groeperingskolommen en retourneert één rij voor elke groep. Daarnaast bevat de uitvoer één kolom voor elke waarde die is opgegeven in de column_list die wordt weergegeven in de pivot_column van de input_table.

Zie de volgende sectie Opmerkingen voor meer informatie.

aggregate_function

Een door het systeem of door de gebruiker gedefinieerde statistische functie die een of meer invoer accepteert. De statistische functie moet invariant zijn voor null-waarden. Een statistische functie invariant voor null-waarden houdt geen rekening met null-waarden in de groep terwijl de statistische waarde wordt geëvalueerd.

De statistische functie COUNT(*) van het systeem is niet toegestaan.

value_column

De waardekolom van de PIVOT-operator. Bij gebruik met UNPIVOT kan value_column niet de naam zijn van een bestaande kolom in de invoer table_source.

VOOR pivot_column

De draaikolom van de PIVOT-operator. pivot_column moet impliciet of expliciet converteerbaar zijn naar nvarchar(). Deze kolom kan niet worden afbeelding of rowversion.

Wanneer UNPIVOT wordt gebruikt, is pivot_column de naam van de uitvoerkolom die wordt beperkt van de table_source. Er kan geen bestaande kolom in table_source met die naam zijn.

IN ( column_list )

In de PIVOT-component worden de waarden in de pivot_column weergegeven die de kolomnamen van de uitvoertabel worden. In de lijst kunnen geen kolomnamen worden opgegeven die al aanwezig zijn in de invoer table_source die worden pivoted.

In de UNPIVOT-component worden de kolommen in table_source weergegeven die zijn beperkt tot één pivot_column.

table_alias

De aliasnaam van de uitvoertabel. pivot_table_alias moet worden opgegeven.

DRAAITABEL <UNPIVOT_CLAUSE>

Hiermee geeft u op dat de invoertabel wordt beperkt van meerdere kolommen in column_list in één kolom met de naam pivot_column. Zie PIVOT- en UNPIVOT-gebruiken voor meer informatie over PIVOT en UNPIVOT.

VANAF <date_time>

Van toepassing op: SQL Server 2016 (13.x) en latere versies en SQL Database.

Retourneert een tabel met één record voor elke rij met de waarden die werkelijk (actueel) waren op het opgegeven tijdstip in het verleden. Intern wordt een samenvoeging uitgevoerd tussen de tijdelijke tabel en de geschiedenistabel en worden de resultaten gefilterd om de waarden in de rij te retourneren die geldig waren op het moment dat is opgegeven door de parameter <date_time>. De waarde voor een rij wordt als geldig beschouwd als de system_start_time_column_name waarde kleiner is dan of gelijk is aan de parameterwaarde <date_time> en de system_end_time_column_name waarde groter is dan de parameterwaarde <date_time>.

VAN <START_DATE_TIME> TOT <END_DATE_TIME>

Van toepassing op: SQL Server 2016 (13.x) en latere versies en SQL Database.

Retourneert een tabel met de waarden voor alle recordversies die actief waren binnen het opgegeven tijdsbereik, ongeacht of ze actief zijn voordat de parameterwaarde <start_date_time> voor het argument FROM of niet meer actief is na de <end_date_time> parameterwaarde voor het argument TO. Intern wordt een samenvoeging uitgevoerd tussen de tijdelijke tabel en de geschiedenistabel en worden de resultaten gefilterd om de waarden te retourneren voor alle rijversies die op elk gewenst moment actief waren tijdens het opgegeven tijdsbereik. Rijen die exact actief werden op de ondergrens die door het FROM-eindpunt is gedefinieerd, worden opgenomen en rijen die exact actief werden op de bovengrens die door het TO-eindpunt is gedefinieerd, worden niet opgenomen.

BETWEEN <start_date_time> AND <end_date_time>

Van toepassing op: SQL Server 2016 (13.x) en latere versies en SQL Database.

Hetzelfde als hierboven in de FROM <start_date_time> TO <end_date_time> beschrijving, met uitzondering van rijen die actief werden op de bovengrens die is gedefinieerd door het <end_date_time>-eindpunt.

OPGENOMEN IN (<start_date_time> , <end_date_time>)

Van toepassing op: SQL Server 2016 (13.x) en latere versies en SQL Database.

Retourneert een tabel met de waarden voor alle recordversies die zijn geopend en gesloten binnen het opgegeven tijdsbereik dat is gedefinieerd door de twee datum/tijd-waarden voor het argument IN. Rijen die exact actief zijn geworden op de ondergrens of die niet meer actief zijn op de bovengrens, worden opgenomen.

ALLE

Retourneert een tabel met de waarden uit alle rijen uit zowel de huidige tabel als de geschiedenistabel.

Opmerkingen

De FROM-component ondersteunt de SQL-92-syntaxis voor gekoppelde tabellen en afgeleide tabellen. SQL-92-syntaxis biedt de operators INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER en CROSS join.

UNION en JOIN binnen een FROM-component worden ondersteund in weergaven en in afgeleide tabellen en subquery's.

Een self-join is een tabel die aan zichzelf is gekoppeld. Voeg bewerkingen in of bij die zijn gebaseerd op een self-join, volg de volgorde in de FROM-component.

Omdat SQL Server rekening houdt met distributie- en kardinaliteitsstatistieken van gekoppelde servers die kolomdistributiestatistieken bieden, is de HINT VOOR REMOTE join niet vereist om het evalueren van een join op afstand af te dwingen. De SQL Server-queryprocessor houdt rekening met externe statistieken en bepaalt of een strategie voor extern koppelen geschikt is. Remote Join hint is handig voor providers die geen kolomdistributiestatistieken bieden.

APPLY gebruiken

Zowel de linker- als rechteroperanden van de operator APPLY zijn tabelexpressies. Het belangrijkste verschil tussen deze operanden is dat de right_table_source een tabelwaardefunctie kan gebruiken die een kolom uit de left_table_source als een van de argumenten van de functie gebruikt. De left_table_source kan tabelwaardefuncties bevatten, maar kan geen argumenten bevatten die kolommen uit de right_table_sourcezijn.

De OPERATOR APPLY werkt op de volgende manier om de tabelbron voor de FROM-component te produceren:

  1. Evalueert right_table_source op elke rij van de left_table_source om rijensets te produceren.

    De waarden in de right_table_source zijn afhankelijk van left_table_source. right_table_source kan ongeveer op deze manier worden weergegeven: TVF(left_table_source.row), waarbij TVF een tabelwaardefunctie is.

  2. Combineert de resultatensets die worden geproduceerd voor elke rij in de evaluatie van right_table_source met de left_table_source door een UNION ALL-bewerking uit te voeren.

    De lijst met kolommen die door het resultaat van de operator APPLY worden geproduceerd, is de set kolommen uit de left_table_source die wordt gecombineerd met de lijst met kolommen uit de right_table_source.

PIVOT en UNPIVOT gebruiken

De pivot_column en value_column groeperen kolommen die worden gebruikt door de PIVOT-operator. PIVOT volgt het volgende proces om de uitvoerresultatenset te verkrijgen:

  1. Hiermee voert u een GROUP BY uit op de input_table van de groeperingskolommen en produceert één uitvoerrij voor elke groep.

    De groeperingskolommen in de uitvoerrij verkrijgen de overeenkomende kolomwaarden voor die groep in de input_table.

  2. Hiermee genereert u waarden voor de kolommen in de kolomlijst voor elke uitvoerrij door het volgende uit te voeren:

    1. Daarnaast groeperen de rijen die in de vorige stap zijn gegenereerd in GROUP BY op basis van de pivot_column.

      Selecteer voor elke uitvoerkolom in de column_listeen subgroep die voldoet aan de voorwaarde:

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

    2. aggregate_function wordt geëvalueerd op basis van de value_column van deze subgroep en wordt het resultaat geretourneerd als de waarde van de bijbehorende output_column. Als de subgroep leeg is, genereert SQL Server een null-waarde voor die output_column. Als de statistische functie COUNT is en de subgroep leeg is, wordt nul (0) geretourneerd.

Notitie

De kolom-id's in de UNPIVOT-component volgen de catalogussortering. Voor SQL Database wordt de sortering altijd SQL_Latin1_General_CP1_CI_AS. Voor gedeeltelijk ingesloten SQL Server-databases wordt de sortering altijd Latin1_General_100_CI_AS_KS_WS_SC. Als de kolom wordt gecombineerd met andere kolommen, is een samenvoegingscomponent (COLLATE DATABASE_DEFAULT) vereist om conflicten te voorkomen.

Zie PIVOT- en UNPIVOT-gebruiken voor meer informatie over PIVOT en UNPIVOT, inclusief voorbeelden.

Machtigingen

Vereist de machtigingen voor de instructie DELETE, SELECT of UPDATE.

Voorbeelden

Een. Een FROM-component gebruiken

In het volgende voorbeeld worden de kolommen TerritoryID en Name opgehaald uit de SalesTerritory tabel in de voorbeelddatabase AdventureWorks2022.

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

Dit is de resultatenset.

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. De hints voor tablock en HOLDLOCK-optimalisatie gebruiken

De volgende gedeeltelijke transactie laat zien hoe u een expliciete gedeelde tabelvergrendeling op Employee plaatst en hoe u de index leest. De vergrendeling wordt gedurende de hele transactie bewaard.

BEGIN TRANSACTION

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

C. De SYNTAXIS VAN SQL-92 CROSS JOIN gebruiken

In het volgende voorbeeld wordt het kruisproduct van de twee tabellen Employee en Department in de Database AdventureWorks2022 geretourneerd. Een lijst met alle mogelijke combinaties van BusinessEntityID rijen en alle Department naamrijen worden geretourneerd.

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. De SQL-92 FULL OUTER JOIN-syntaxis gebruiken

In het volgende voorbeeld worden de productnaam en eventuele bijbehorende verkooporders in de tabel SalesOrderDetail in de database AdventureWorks2022 geretourneerd. Ook worden verkooporders geretourneerd die geen product bevatten in de tabel Product en producten met een andere verkooporder dan de producten die in de tabel Product worden vermeld.

-- 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. De SYNTAXIS VAN DE LEFT OUTER JOIN van SQL-92 gebruiken

In het volgende voorbeeld worden twee tabellen samengevoegd op ProductID en blijven de niet-overeenkomende rijen uit de linkertabel behouden. De Product tabel wordt vergeleken met de SalesOrderDetail tabel in de ProductID kolommen in elke tabel. Alle producten, besteld en niet besteld, worden weergegeven in de resultatenset.

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. De SQL-92 INNER JOIN-syntaxis gebruiken

In het volgende voorbeeld worden alle productnamen en verkooporder-id's geretourneerd.

-- 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. De SYNTAXIS van SQL-92 RIGHT OUTER JOIN gebruiken

In het volgende voorbeeld worden twee tabellen op TerritoryID samengevoegd en blijven de niet-overeenkomende rijen uit de rechtertabel behouden. De SalesTerritory tabel wordt vergeleken met de SalesPerson tabel in de kolom TerritoryID in elke tabel. Alle verkopers worden weergegeven in de resultatenset, ongeacht of ze al dan niet een gebied zijn toegewezen.

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. Hints voor HASH- en MERGE-join gebruiken

In het volgende voorbeeld wordt een join met drie tabellen uitgevoerd tussen de Product, ProductVendoren Vendor tabellen om een lijst met producten en hun leveranciers te maken. Met de query optimizer worden Product en ProductVendor (p en pv) samengevoegd met behulp van een MERGE-join. Vervolgens worden de resultaten van de Product en ProductVendor MERGE join (p en pv) toegevoegd aan de Vendor tabel om te produceren (p en pv) en v.

Belangrijk

Nadat een join-hint is opgegeven, is het sleutelwoord INNER niet meer optioneel en moet het expliciet worden opgegeven voor een INNER JOIN die moet worden uitgevoerd.

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;

Ik. Een afgeleide tabel gebruiken

In het volgende voorbeeld wordt een afgeleide tabel, een SELECT-instructie na de FROM-component, gebruikt om de voor- en achternamen van alle werknemers en de steden waarin ze wonen, te retourneren.

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 gebruiken om gegevens te lezen uit een voorbeeld van rijen in een tabel

In het volgende voorbeeld wordt TABLESAMPLE in de FROM-component gebruikt om ongeveer 10 procent van alle rijen in de Customer tabel te retourneren.

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

K. APPLY gebruiken

In het volgende voorbeeld wordt ervan uitgegaan dat de volgende tabellen en tabelwaarden in de database bestaan:

Objectnaam Kolomnamen
Afdelingen DeptID, DivisionID, DeptName, DeptMgrID
EmpMgr MgrID, EmpID
Medewerkers EmpID, EmpLastName, EmpFirstName, EmpSalary
GetReports (MgrID) EmpID, EmpLastName, EmpSalary

De GetReports functie met tabelwaarde retourneert de lijst met alle werknemers die direct of indirect rapporteren aan de opgegeven MgrID.

In het voorbeeld wordt APPLY gebruikt om alle afdelingen en alle werknemers in die afdeling te retourneren. Als een bepaalde afdeling geen werknemers heeft, worden er geen rijen geretourneerd voor die afdeling.

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

Als u wilt dat de query rijen produceert voor die afdelingen zonder werknemers, waardoor null-waarden worden geproduceerd voor de kolommen EmpID, EmpLastName en EmpSalary, gebruikt u in plaats daarvan OUTER APPLY.

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

L. CROSS APPLY gebruiken

In het volgende voorbeeld wordt een momentopname opgehaald van alle queryplannen die zich in de plancache bevinden door een query uit te voeren op de sys.dm_exec_cached_plans dynamische beheerweergave om de plangrepen van alle queryplannen in de cache op te halen. Vervolgens wordt de operator CROSS APPLY opgegeven om de plangrepen door te geven aan sys.dm_exec_query_plan. De XML Showplan-uitvoer voor elk plan dat zich momenteel in de plancache bevindt, bevindt zich in de query_plan kolom van de tabel die wordt geretourneerd.

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. FOR SYSTEM_TIME gebruiken

Van toepassing op: SQL Server 2016 (13.x) en latere versies en SQL Database.

In het volgende voorbeeld wordt het argument FOR SYSTEM_TIME AS OF date_time_literal_or_variable gebruikt om tabelrijen te retourneren die vanaf 1 januari 2014 werkelijk (actueel) waren.

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

In het volgende voorbeeld wordt het argument FOR SYSTEM_TIME FROM date_time_literal_or_variable TO date_time_literal_or_variable gebruikt om alle rijen te retourneren die actief waren tijdens de periode die is gedefinieerd met ingang van 1 januari 2013 en eindigend met 1 januari 2014, exclusief van de bovengrens.

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

In het volgende voorbeeld wordt het argument FOR SYSTEM_TIME BETWEEN date_time_literal_or_variable AND date_time_literal_or_variable gebruikt om alle rijen te retourneren die actief waren tijdens de periode die is gedefinieerd met ingang van 1 januari 2013 en eindigend op 1 januari 2014, inclusief de bovengrens.

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

In het volgende voorbeeld wordt het argument FOR SYSTEM_TIME IN (date_time_literal_or_variable, date_time_literal_or_variable) gebruikt om alle rijen te retourneren die zijn geopend en gesloten tijdens de periode die is gedefinieerd met ingang van 1 januari 2013 en eindigend op 1 januari 2014.

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

In het volgende voorbeeld wordt een variabele gebruikt in plaats van een letterlijke waarde om de datumgrenswaarden voor de query op te geven.

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;

Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)

N. De SYNTAXIS VAN INNER JOIN gebruiken

In het volgende voorbeeld worden de kolommen SalesOrderNumber, ProductKeyen EnglishProductName uit de FactInternetSales- en DimProduct tabellen geretourneerd waarin de joinsleutel, ProductKey, in beide tabellen overeenkomt. De SalesOrderNumber en EnglishProductName kolommen bestaan alleen in een van de tabellen, dus het is niet nodig om de tabelalias met deze kolommen op te geven, zoals wordt weergegeven; deze aliassen zijn opgenomen voor leesbaarheid. Het woord AS- voordat een aliasnaam niet vereist is, maar wordt aanbevolen voor leesbaarheid en om te voldoen aan de ANSI-standaard.

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

Omdat het INNER trefwoord niet vereist is voor inner joins, kan dezelfde query worden geschreven als:

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

Met deze query kan ook een WHERE-component worden gebruikt om de resultaten te beperken. In dit voorbeeld worden de resultaten beperkt tot SalesOrderNumber waarden hoger dan '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. De SYNTAXIS VAN LEFT OUTER JOIN en RIGHT OUTER JOIN gebruiken

In het volgende voorbeeld worden de tabellen FactInternetSales en DimProduct in de kolommen ProductKey samengevoegd. De syntaxis van de left outer join behoudt de niet-overeenkomende rijen uit de linkertabel (FactInternetSales). Omdat de FactInternetSales tabel geen ProductKey waarden bevat die niet overeenkomen met de DimProduct tabel, retourneert deze query dezelfde rijen als het eerste inner join-voorbeeld eerder in dit artikel.

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

Deze query kan ook worden geschreven zonder het trefwoord OUTER.

In right outer joins blijven de niet-overeenkomende rijen uit de rechtertabel behouden. In het volgende voorbeeld worden dezelfde rijen geretourneerd als het bovenstaande left outer join-voorbeeld.

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

De volgende query maakt gebruik van de DimSalesTerritory tabel als de linkertabel in een left outer join. Hiermee worden de SalesOrderNumber waarden opgehaald uit de FactInternetSales tabel. Als er geen orders zijn voor een bepaalde SalesTerritoryKey, retourneert de query een NULL voor de SalesOrderNumber voor die rij. Deze query wordt gerangschikt op de SalesOrderNumber kolom, zodat eventuele NULL's in deze kolom boven aan de resultaten worden weergegeven.

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

Deze query kan worden herschreven met een right outer join om dezelfde resultaten op te halen:

-- 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. De SYNTAXIS VAN FULL OUTER JOIN gebruiken

In het volgende voorbeeld ziet u een volledige outer join, die alle rijen uit beide gekoppelde tabellen retourneert, maar NULL retourneert voor waarden die niet overeenkomen met de andere 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;

Deze query kan ook worden geschreven zonder het trefwoord 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. De SYNTAXIS VAN CROSS JOIN gebruiken

In het volgende voorbeeld wordt het kruisproduct van de tabellen FactInternetSales en DimSalesTerritory geretourneerd. Een lijst met alle mogelijke combinaties van SalesOrderNumber en SalesTerritoryKey worden geretourneerd. Let op het ontbreken van de ON component in de cross join-query.

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

R. Een afgeleide tabel gebruiken

In het volgende voorbeeld wordt een afgeleide tabel (een SELECT-instructie na de FROM-component) gebruikt om de kolommen CustomerKey en LastName van alle klanten in de tabel DimCustomer met BirthDate waarden later dan 1 januari 1970 en de achternaam Smith te retourneren.

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

S. Voorbeeld van HINT VOOR REDUCE-join

In het volgende voorbeeld wordt de hint voor REDUCE join gebruikt om de verwerking van de afgeleide tabel in de query te wijzigen. Wanneer u de hint voor REDUCE join in deze query gebruikt, wordt de fis.ProductKey geprojecteerd, gerepliceerd en uniek gemaakt en vervolgens toegevoegd aan DimProduct tijdens de willekeurige volgorde van DimProduct op ProductKey. De resulterende afgeleide tabel wordt gedistribueerd op 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. Voorbeeld van hint voor REPLICEren

In dit volgende voorbeeld ziet u dezelfde query als in het vorige voorbeeld, behalve dat een hint voor REPLICATE join wordt gebruikt in plaats van de hint voor REDUCE join. Door het gebruik van de REPLICATE hint worden de waarden in de kolom ProductKey (samenvoegen) uit de FactInternetSales tabel gerepliceerd naar alle knooppunten. De DimProduct tabel is gekoppeld aan de gerepliceerde versie van deze waarden.

-- 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. Gebruik de hint REDISTRIBUTE om een shuffle-verplaatsing voor een incompatibele distributie te garanderen

De volgende query maakt gebruik van de hint voor de REDISTRIBUTE-query voor een incompatibele distributie. Dit garandeert dat de queryoptimalisatie gebruikmaakt van een Shuffle-verplaatsing in het queryplan. Dit garandeert ook dat het queryplan geen broadcast-verplaatsing gebruikt, waardoor een gedistribueerde tabel naar een gerepliceerde tabel wordt verplaatst.

In het volgende voorbeeld dwingt de HINT REDISTRIBUTE de verplaatsing naar de tabel FactInternetSales af omdat ProductKey de distributiekolom voor DimProduct is en niet de distributiekolom voor FactInternetSales is.

-- 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 gebruiken om gegevens te lezen uit een voorbeeld van rijen in een tabel

In het volgende voorbeeld wordt TABLESAMPLE in de FROM-component gebruikt om ongeveer 10 procent van alle rijen in de Customer tabel te retourneren.

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