FROM (Transact-SQL)FROM (Transact-SQL)

GILT FÜR: jaSQL Server (ab 2008) jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data WarehouseAPPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Legt die Tabellen, Sichten, abgeleiteten Tabellen und verknüpften Tabellen in DELETE-, SELECT- und UPDATE-Anweisungen in SQL Server 2017SQL Server 2017 fest.Specifies the tables, views, derived tables, and joined tables used in DELETE, SELECT, and UPDATE statements in SQL Server 2017SQL Server 2017. Die FROM-Klausel wird in der SELECT-Anweisung immer benötigt, es sei denn, die Auswahlliste enthält nur Konstanten, Variablen und arithmetische Ausdrücke (keine Spaltennamen).In the SELECT statement, the FROM clause is required except when the select list contains only constants, variables, and arithmetic expressions (no column names).

Themenlinksymbol Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

-- Syntax for SQL Server and Azure SQL Database  

[ FROM { <table_source> } [ ,...n ] ]   
<table_source> ::=   
{  
    table_or_view_name [ [ AS ] table_alias ]   
        [ <tablesample_clause> ]   
        [ WITH ( < table_hint > [ [ , ]...n ] ) ]   
    | rowset_function [ [ AS ] table_alias ]   
        [ ( bulk_column_alias [ ,...n ] ) ]   
    | user_defined_function [ [ AS ] table_alias ]  
    | OPENXML <openxml_clause>   
    | derived_table [ [ AS ] table_alias ] [ ( column_alias [ ,...n ] ) ]   
    | <joined_table>   
    | <pivoted_table>   
    | <unpivoted_table>  
    | @variable [ [ AS ] table_alias ]  
    | @variable.function_call ( expression [ ,...n ] )   
        [ [ AS ] table_alias ] [ (column_alias [ ,...n ] ) ]  
    | FOR SYSTEM_TIME <system_time>   
}  
<tablesample_clause> ::=  
    TABLESAMPLE [SYSTEM] ( sample_number [ PERCENT | ROWS ] )   
        [ REPEATABLE ( repeat_seed ) ]   

<joined_table> ::=   
{  
    <table_source> <join_type> <table_source> ON <search_condition>   
    | <table_source> CROSS JOIN <table_source>   
    | left_table_source { CROSS | OUTER } APPLY right_table_source   
    | [ ( ] <joined_table> [ ) ]   
}  
<join_type> ::=   
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]  
    JOIN  

<pivoted_table> ::=  
    table_source PIVOT <pivot_clause> [ [ AS ] table_alias ]  

<pivot_clause> ::=  
        ( aggregate_function ( value_column [ [ , ]...n ])   
        FOR pivot_column   
        IN ( <column_list> )   
    )   

<unpivoted_table> ::=  
    table_source UNPIVOT <unpivot_clause> [ [ AS ] table_alias ]  

<unpivot_clause> ::=  
    ( value_column FOR pivot_column IN ( <column_list> ) )   

<column_list> ::=  
    column_name [ ,...n ]   

<system_time> ::=  
{  
       AS OF <date_time>  
    |  FROM <start_date_time> TO <end_date_time>  
    |  BETWEEN <start_date_time> AND <end_date_time>  
    |  CONTAINED IN (<start_date_time> , <end_date_time>)   
    |  ALL  
}  

    <date_time>::=  
        <date_time_literal> | @date_time_variable  

    <start_date_time>::=  
        <date_time_literal> | @date_time_variable  

    <end_date_time>::=  
        <date_time_literal> | @date_time_variable  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

FROM { <table_source> [ ,...n ] }  

<table_source> ::=   
{  
    [ database_name . [ schema_name ] . | schema_name . ] table_or_view_name [ AS ] table_or_view_alias 
    [<tablesample_clause>]  
    | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]  
    | <joined_table>  
}  

<tablesample_clause> ::=
    TABLESAMPLE ( sample_number [ PERCENT ] ) -- SQL Data Warehouse only  

<joined_table> ::=   
{  
    <table_source> <join_type> <table_source> ON search_condition   
    | <table_source> CROSS JOIN <table_source> 
    | left_table_source { CROSS | OUTER } APPLY right_table_source   
    | [ ( ] <joined_table> [ ) ]   
}  

<join_type> ::=   
    [ INNER ] [ <join hint> ] JOIN  
    | LEFT  [ OUTER ] JOIN  
    | RIGHT [ OUTER ] JOIN  
    | FULL  [ OUTER ] JOIN  

<join_hint> ::=   
    REDUCE  
    | REPLICATE  
    | REDISTRIBUTE  

ArgumenteArguments

<table_source><table_source>
Gibt eine Tabelle, Sicht, Tabellenvariable oder abgeleitete Tabelle als Quelle mit oder ohne Alias zum Verwenden in der Transact-SQLTransact-SQL-Anweisung an.Specifies a table, view, table variable, or derived table source, with or without an alias, to use in the Transact-SQLTransact-SQL statement. In einer Anweisung können bis zu 256 Tabellenquellen verwendet werden. Allerdings variiert das Limit in Abhängigkeit vom verfügbaren Arbeitsspeicher und der Komplexität anderer Ausdrücke in der Abfrage.Up to 256 table sources can be used in a statement, although the limit varies depending on available memory and the complexity of other expressions in the query. Einzelne Abfragen unterstützen möglicherweise nicht bis zu 256 Tabellenquellen.Individual queries may not support up to 256 table sources.

Hinweis

Durch eine hohe Anzahl an Tabellen, auf die in einer Abfrage verwiesen wird, kann möglicherweise die Abfrageleistung beeinträchtigt werden.Query performance may suffer with lots of tables referenced in a query. Zusätzliche Faktoren haben außerdem Auswirkungen auf die Kompilierungs- und Optimierungszeit.Compilation and optimization time is also affected by additional factors. Dazu zählt das Vorhandensein von Indizes und indizierten Sichten für das <table_source>-Argument und die Größe des <select_list>-Arguments in der SELECT-Anweisung.These include the presence of indexes and indexed views on each <table_source> and the size of the <select_list> in the SELECT statement.

Die Reihenfolge der Tabellenquellen nach dem FROM-Schlüsselwort hat keinen Einfluss auf das Resultset.The order of table sources after the FROM keyword does not affect the result set that is returned. SQL ServerSQL Server gibt Fehler zurück, wenn doppelte Namen in der FROM-Klausel angezeigt werden.returns errors when duplicate names appear in the FROM clause.

table_or_view_nametable_or_view_name
Der Name einer Tabelle oder Sicht.Is the name of a table or view.

Ist die Tabelle oder Sicht in einer anderen Datenbank der gleichen Instanz von SQL ServerSQL Server vorhanden, verwenden Sie einen vollqualifizierten Namen in der Form database.schema.object_name.If the table or view exists in another database on the same instance of SQL ServerSQL Server, use a fully qualified name in the form database.schema.object_name.

Ist die Tabelle oder die Sicht außerhalb der Instanz von SQL ServerSQL Server vorhanden, verwenden Sie einen vierteiligen Namen in der Form linked_server.catalog.schema.object.If the table or view exists outside the instance of SQL ServerSQL Serverl, use a four-part name in the form linked_server.catalog.schema.object. Weitere Informationen finden Sie unter sp_addlinkedserver (Transact-SQL) erläutert.For more information, see sp_addlinkedserver (Transact-SQL). Ein vierteiliger Name mit der OPENDATASOURCE-Funktion als Serverteil des Namens kann ebenfalls zum Angeben der Remotequelltabelle verwendet werden.A four-part name that is constructed by using the OPENDATASOURCE function as the server part of the name can also be used to specify the remote table source. Wenn OPENDATASOURCE angegeben wird, gelten database_name und schema_name möglicherweise nicht für alle Datenquellen und unterliegen den Funktionen des OLE DB-Anbieters, der auf das Remoteobjekt zugreift.When OPENDATASOURCE is specified, database_name and schema_name may not apply to all data sources and is subject to the capabilities of the OLE DB provider that accesses the remote object.

[AS] table_alias[AS] table_alias
Ein Alias fürtable_source, der zur Vereinfachung oder zur Unterscheidung einer Tabelle oder Sicht in einem Selbstjoin oder einer Unterabfrage verwendet werden kann.Is an alias for table_source that can be used either for convenience or to distinguish a table or view in a self-join or subquery. Ein Alias ist oftmals ein verkürzter Tabellenname, der verwendet wird, um in einem Join auf bestimmte Spalten der beteiligten Tabellen zu verweisen.An alias is frequently a shortened table name used to refer to specific columns of the tables in a join. Falls ein Spaltenname in mehr als einer Tabelle des Joins vorkommt, muss dieser Spaltenname für SQL ServerSQL Server durch einen Tabellennamen, einen Sichtnamen oder einen Alias gekennzeichnet werden.If the same column name exists in more than one table in the join, SQL ServerSQL Server requires that the column name be qualified by a table name, view name, or alias. Falls ein Alias definiert ist, kann der Tabellenname nicht verwendet werden.The table name cannot be used if an alias is defined.

Wenn eine abgeleitete Tabelle, Rowsetwertfunktion, Tabellenwertfunktion oder Operatorklausel (z.B. PIVOT oder UNPIVOT) verwendet wird, ist der erforderliche table_alias-Ausdruck am Ende der Klausel der zurückgegebene verknüpfte Tabellenname für alle Spalten, einschließlich gruppierter Spalten.When a derived table, rowset or table-valued function, or operator clause (such as PIVOT or UNPIVOT) is used, the required table_alias at the end of the clause is the associated table name for all columns, including grouping columns, returned.

WITH (<table_hint> )WITH (<table_hint> )
Gibt an, dass der Abfrageoptimierer eine Optimierungs- oder Sperrstrategie bei dieser Tabelle und für diese Anweisung verwendet.Specifies that the query optimizer use an optimization or locking strategy with this table and for this statement. Weitere Informationen finden Sie unter Tabellenhinweise (Transact-SQL).For more information, see Table Hints (Transact-SQL).

rowset_functionrowset_function

Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017 und SQL-DatenbankSQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and SQL-DatenbankSQL Database.

Gibt eine der Rowsetfunktionen (z. B. OPENROWSET) an, die ein Objekt zurückgeben, das statt eines Tabellenverweises verwendet werden kann.Specifies one of the rowset functions, such as OPENROWSET, that returns an object that can be used instead of a table reference. Weitere Informationen zur Liste mit Rowsetfunktionen finden Sie unter Rowsetfunktionen (Transact-SQL).For more information about a list of rowset functions, see Rowset Functions (Transact-SQL).

Die Verwendung der OPENROWSET- und OPENQUERY-Funktionen zum Angeben eines Remoteobjekts hängt von den Fähigkeiten des OLE DB-Anbieters ab, der auf das Objekt zugreift.Using the OPENROWSET and OPENQUERY functions to specify a remote object depends on the capabilities of the OLE DB provider that accesses the object.

bulk_column_aliasbulk_column_alias

Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017 und SQL-DatenbankSQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and SQL-DatenbankSQL Database.

Ein optionaler Alias, der einen Spaltennamen im Resultset ersetzt.Is an optional alias to replace a column name in the result set. Spaltenaliase sind nur in SELECT-Anweisungen zulässig, die die OPENROWSET-Funktion mit der BULK-Option verwenden.Column aliases are allowed only in SELECT statements that use the OPENROWSET function with the BULK option. Wenn Sie bulk_column_alias verwenden, geben Sie einen Alias für jede Tabellenspalte in derselben Reihenfolge wie die Spalten in der Datei an.When you use bulk_column_alias, specify an alias for every table column in the same order as the columns in the file.

Hinweis

Dieser Alias überschreibt das NAME-Attribut in den COLUMN-Elementen einer XML-Formatdatei, sofern vorhanden.This alias overrides the NAME attribute in the COLUMN elements of an XML format file, if present.

user_defined_functionuser_defined_function
Gibt eine Tabellenwertfunktion an.Specifies a table-valued function.

OPENXML <openxml_clause>OPENXML <openxml_clause>

Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017 und SQL-DatenbankSQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and SQL-DatenbankSQL Database.

Stellt eine Rowsetsicht eines XML-Dokuments bereit.Provides a rowset view over an XML document. Weitere Informationen finden Sie unter OPENXML (Transact-SQL).For more information, see OPENXML (Transact-SQL).

derived_tablederived_table
Entspricht einer Unterabfrage, die Zeilen von der Datenbank abruft.Is a subquery that retrieves rows from the database. derived_table wird für die äußere Abfrage als Eingabe verwendet.derived_table is used as input to the outer query.

derived _table kann mithilfe des Tabellenwertkonstruktors von Transact-SQLTransact-SQL mehrere Zeilen angeben.derived _table can use the Transact-SQLTransact-SQL table value constructor feature to specify multiple rows. Beispiel: SELECT * FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);.For example, SELECT * FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);. Weitere Informationen finden Sie unter Tabellenwertkonstruktor (Transact-SQL).For more information, see Table Value Constructor (Transact-SQL).

column_aliascolumn_alias
Ein optionaler Alias, der einen Spaltennamen im Resultset der abgeleiteten Tabelle ersetzen soll.Is an optional alias to replace a column name in the result set of the derived table. Geben Sie für jede Spalte in der Auswahlliste einen Spaltenalias an, und schließen Sie die gesamte Liste der Spaltenaliasnamen in Klammern ein.Include one column alias for each column in the select list, and enclose the complete list of column aliases in parentheses.

table_or_view_name FOR SYSTEM_TIME <system_time>table_or_view_name FOR SYSTEM_TIME <system_time>

Gilt für: SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis SQL Server 2017SQL Server 2017 und SQL-DatenbankSQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL-DatenbankSQL Database.

Gibt an, dass eine bestimmte Version von Daten aus der angegebenen temporalen Tabelle und die verknüpfte Verlaufstabelle mit Systemversionsverwaltung zurückgegeben werden.Specifies that a specific version of data is returned from the specified temporal table and its linked system-versioned history table

TABLESAMPLE-KlauselTablesample clause

Gilt für: SQL Server und SQL-DatenbankApplies to: SQL Server, SQL Database

Gibt an, dass Beispieldaten aus der Tabelle zurückgegeben werden.Specifies that a sample of data from the table is returned. Die Beispieldaten können ungefähr sein.The sample may be approximate. Diese Klausel kann für eine primäre oder verknüpfte Tabelle in einer SELECT- oder UPDATE-Anweisung verwendet werden.This clause can be used on any primary or joined table in a SELECT or UPDATE statement. TABLESAMPLE kann nicht für Sichten angegeben werden.TABLESAMPLE cannot be specified with views.

Hinweis

Wenn Sie TABLESAMPLE für Datenbanken verwenden, die auf SQL ServerSQL Server aktualisiert wurden, wird der Kompatibilitätsgrad der Datenbank auf mindestens 110 festgelegt, und PIVOT ist in einer rekursiven allgemeinen Tabellenausdrucksabfrage (CTE, Common Table Expression) nicht zugelassen.When you use TABLESAMPLE against databases that are upgraded to SQL ServerSQL Server, the compatibility level of the database is set to 110 or higher, PIVOT is not allowed in a recursive common table expression (CTE) query. Weitere Informationen finden Sie unter ALTER DATABASE-Kompatibilitätsgrad (Transact-SQL).For more information, see ALTER DATABASE Compatibility Level (Transact-SQL).

SYSTEMSYSTEM
Eine von der Implementierung abhängige Stichprobenmethode, die durch ISO-Standards angegeben ist.Is an implementation-dependent sampling method specified by ISO standards. In SQL ServerSQL Server ist dies die einzige verfügbare Stichprobenmethode. Sie wird standardmäßig angewendet.In SQL ServerSQL Server, this is the only sampling method available and is applied by default. SYSTEM wendet eine seitenbasierte Stichprobenmethode an, in der eine zufällige Gruppe von Seiten aus der Tabelle für die Stichprobe ausgewählt wird. Alle Zeilen auf diesen Seiten werden als Stichprobenteilmenge zurückgegeben.SYSTEM applies a page-based sampling method in which a random set of pages from the table is chosen for the sample, and all the rows on those pages are returned as the sample subset.

sample_numbersample_number
Ein genauer oder ungefährer konstanter numerischer Ausdruck, der den Prozentanteil oder die Anzahl der Zeilen angibt.Is an exact or approximate constant numeric expression that represents the percent or number of rows. Bei der Angabe für PERCENT wird sample_number implizit in einen float-Wert konvertiert. Anderenfalls wird das Argument in bigint konvertiert.When specified with PERCENT, sample_number is implicitly converted to a float value; otherwise, it is converted to bigint. PERCENT ist die Standardeinstellung.PERCENT is the default.

PERCENTPERCENT
Gibt an, dass ein sample_number-Prozentanteil der Zeilen einer Tabelle aus der Tabelle abgerufen werden soll.Specifies that a sample_number percent of the rows of the table should be retrieved from the table. Wenn PERCENT angegeben wird, gibt SQL ServerSQL Server einen ungefähren Wert des angegebenen Prozentanteils zurück.When PERCENT is specified, SQL ServerSQL Server returns an approximate of the percent specified. Wenn PERCENT angegeben wird, muss der sample_number-Ausdruck zu einem Wert von 0 bis 100 ausgewertet werden.When PERCENT is specified the sample_number expression must evaluate to a value from 0 to 100.

ROWSROWS
Gibt an, dass eine ungefähre sample_number-Zeilenanzahl abgerufen wird.Specifies that approximately sample_number of rows will be retrieved. Wenn ROWS angegeben ist, gibt SQL ServerSQL Server ungefähr die angegebene Zeilenanzahl zurück.When ROWS is specified, SQL ServerSQL Server returns an approximation of the number of rows specified. Wenn ROWS angegeben ist, muss der sample_number-Ausdruck zu einem ganzzahligen Wert größer als null ausgewertet werden.When ROWS is specified, the sample_number expression must evaluate to an integer value greater than zero.

REPEATABLEREPEATABLE
Gibt an, dass die ausgewählten Stichprobendaten erneut zurückgegeben werden können.Indicates that the selected sample can be returned again. Bei Angabe mit demselben repeat_seed-Wert gibt SQL ServerSQL Server dieselbe Teilmenge von Zeilen zurück, wenn noch keine Änderungen an den Zeilen in der Tabelle vorgenommen wurden.When specified with the same repeat_seed value, SQL ServerSQL Server will return the same subset of rows as long as no changes have been made to any rows in the table. Bei Angabe mit einem anderen repeat_seed-Wert gibt SQL ServerSQL Server möglicherweise einige andere Stichprobenzeilen in der Tabelle zurück.When specified with a different repeat_seed value, SQL ServerSQL Server will likely return some different sample of the rows in the table. Die folgenden an der Tabelle vorgenommenen Aktionen gelten als Änderungen: Einfügen, Aktualisieren, Löschen, neues Erstellen oder Defragmentieren von Indizes sowie Wiederherstellen oder Anfügen von Datenbanken.The following actions to the table are considered changes: insert, update, delete, index rebuild or defragmentation, and database restore or attach.

repeat_seedrepeat_seed
Ist ein konstanter ganzzahliger Ausdruck, der von SQL ServerSQL Server zum Generieren einer Zufallszahl verwendet wird.Is a constant integer expression used by SQL ServerSQL Server to generate a random number. repeat_seed ist vom Datentyp bigint.repeat_seed is bigint. Wenn repeat_seed nicht angegeben ist, weist SQL ServerSQL Server einen zufälligen Wert zu.If repeat_seed is not specified, SQL ServerSQL Server assigns a value at random. Für einen bestimmten repeat_seed-Wert ist das Stichprobenergebnis immer gleich, wenn keine Änderungen auf die Tabelle angewendet wurden.For a specific repeat_seed value, the sampling result is always the same if no changes have been applied to the table. Der repeat_seed-Ausdruck muss zu einem ganzzahligen Wert größer null ausgewertet werden.The repeat_seed expression must evaluate to an integer greater than zero.

TABLESAMPLE-KlauselTablesample clause

Gilt für: SQL Data WarehouseApplies to: SQL Data Warehouse

Gibt an, dass Beispieldaten aus der Tabelle zurückgegeben werden.Specifies that a sample of data from the table is returned. Die Beispieldaten können ungefähr sein.The sample may be approximate. Diese Klausel kann für eine primäre oder verknüpfte Tabelle in einer SELECT- oder UPDATE-Anweisung verwendet werden.This clause can be used on any primary or joined table in a SELECT or UPDATE statement. TABLESAMPLE kann nicht für Sichten angegeben werden.TABLESAMPLE cannot be specified with views.

PERCENTPERCENT
Gibt an, dass ein sample_number-Prozentanteil der Zeilen einer Tabelle aus der Tabelle abgerufen werden soll.Specifies that a sample_number percent of the rows of the table should be retrieved from the table. Wenn PERCENT angegeben wird, gibt SQL Data Warehouse einen ungefähren Wert des angegebenen Prozentanteils zurück.When PERCENT is specified, SQL Data Warehouse returns an approximate of the percent specified. Wenn PERCENT angegeben wird, muss die Auswertung des sample_number-Ausdrucks einen Wert von 0 bis 100 ergeben.When PERCENT is specified, the sample_number expression must evaluate to a value from 0 to 100.

Verknüpfte TabelleJoined table

Eine verknüpfte Tabelle ist ein Resultset, das das Produkt von zwei oder mehr Tabellen darstellt.A joined table is a result set that is the product of two or more tables. Verwenden Sie für mehrere Joins Klammern, um die natürliche Joinreihenfolge zu ändern.For multiple joins, use parentheses to change the natural order of the joins.

JointypJoin type

Gibt den Typ der Joinoperation an.Specifies the type of join operation.

INNERINNER
Gibt an, dass alle übereinstimmenden Paare von Zeilen zurückgegeben werden.Specifies all matching pairs of rows are returned. Zeilen, die in den beiden Tabellen nicht übereinstimmen, werden verworfen.Discards unmatched rows from both tables. Wenn kein Jointyp angegeben wird, ist dies die Standardeinstellung.When no join type is specified, this is the default.

FULL [OUTER]FULL [ OUTER ]
Gibt an, dass eine Zeile aus der linken oder der rechten Tabelle im Resultset aufgeführt werden soll, die die Joinbedingung nicht erfüllt. Die Ausgabespalten der anderen Tabelle werden in diesem Fall auf NULL festgelegt.Specifies that a row from either the left or right table that does not meet the join condition is included in the result set, and output columns that correspond to the other table are set to NULL. Dies erfolgt zusätzlich zu allen Zeilen, die von INNER JOIN zurückgegeben werden.This is in addition to all rows typically returned by the INNER JOIN.

LEFT [OUTER]LEFT [ OUTER ]
Gibt an, dass alle Zeilen der linken Tabelle, die die angegebene Joinbedingung nicht erfüllen, im Resultset enthalten sind. Die Ausgabespalten der anderen Tabelle werden auf NULL gesetzt. Dies erfolgt zusätzlich zu allen Zeilen, die von INNER JOIN zurückgegeben werden.Specifies that all rows from the left table not meeting the join condition are included in the result set, and output columns from the other table are set to NULL in addition to all rows returned by the inner join.

RIGHT [OUTER]RIGHT [OUTER]
Gibt an, dass alle Zeilen der rechten Tabelle, die die angegebene Joinbedingung nicht erfüllen, im Resultset enthalten sind. Die Ausgabespalten der anderen Tabelle werden auf NULL gesetzt. Dies erfolgt zusätzlich zu allen Zeilen, die von INNER JOIN zurückgegeben werden.Specifies all rows from the right table not meeting the join condition are included in the result set, and output columns that correspond to the other table are set to NULL, in addition to all rows returned by the inner join.

JointippJoin hint

Gibt für SQL ServerSQL Server und SQL-DatenbankSQL Database an, dass der Abfrageoptimierer von SQL ServerSQL Server pro Join genau einen in der FROM-Klausel angegebenen Joinhinweis oder Ausführungsalgorithmus verwendet.For SQL ServerSQL Server and SQL-DatenbankSQL Database, specifies that the SQL ServerSQL Server query optimizer use one join hint, or execution algorithm, per join specified in the query FROM clause. Weitere Informationen finden Sie unter Joinhinweise (Transact-SQL).For more information, see Join Hints (Transact-SQL).

Bei SQL Data WarehouseSQL Data Warehouse und Parallel Data WarehouseParallel Data Warehouse gelten diese Joinhinweise für INNER Joins in zwei verteilungsinkompatiblen Spalten.For SQL Data WarehouseSQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse, these join hints apply to INNER joins on two distribution incompatible columns. Sie können die Abfrageleistung verbessern, indem Sie die Anzahl der Datenverschiebungen bei der Verarbeitung von Abfragen einschränken.They can improve query performance by restricting the amount of data movement that occurs during query processing. Die zulässigen Joinhinweise für SQL Data WarehouseSQL Data Warehouse und Parallel Data WarehouseParallel Data Warehouse lauten wie folgt:The allowable join hints for SQL Data WarehouseSQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse are as follows:

REDUCEREDUCE
Reduziert die Anzahl der Zeilen, die für die Tabelle auf der rechten Seite des Joins verschoben werden, um zwei verteilungsinkompatible Tabellen kompatibel zu machen.Reduces the number of rows to be moved for the table on the right side of the join in order to make two distribution incompatible tables compatible. Der REDUCE-Hinweis wird auch als Semijoinhinweis bezeichnet.The REDUCE hint is also called a semi-join hint.

REPLICATEREPLICATE
Bewirkt, dass die Werte in der Verknüpfungsspalte aus der Tabelle auf der linken Seite des Joins auf allen Knoten repliziert werden.Causes the values in the joining column from the table on the left side of the join to be replicated to all nodes. Die Tabelle auf der rechten Seite wird mit der replizierten Version dieser Spalten verknüpft.The table on the right is joined to the replicated version of those columns.

REDISTRIBUTEREDISTRIBUTE
Erzwingt, dass zwei Datenquellen in Spalten verteilt werden, die in der JOIN-Klausel angegeben sind.Forces two data sources to be distributed on columns specified in the JOIN clause. Bei einer verteilten Tabelle führt Parallel Data WarehouseParallel Data Warehouse eine Verschiebung mit Vermischung durch.For a distributed table, Parallel Data WarehouseParallel Data Warehouse will perform a shuffle move. Bei einer replizierten Tabelle führt Parallel Data WarehouseParallel Data Warehouse eine Zuschneide-Verschiebung durch.For a replicated table, Parallel Data WarehouseParallel Data Warehouse will perform a trim move. Informationen zu diesen Verschiebungsarten finden Sie im Abschnitt "DMS Query Plan Operations" (DMS-Abfrageplanvorgänge) im Thema "Understanding Query Plans" (Informationen zu Abfrageplänen) in der Parallel Data Warehouse product documentation (Parallel Data Warehouse-Produktdokumentation)Parallel Data Warehouse product documentation.To understand these move types, see the "DMS Query Plan Operations" section in the "Understanding Query Plans" topic in the Parallel Data Warehouse product documentation (Parallel Data Warehouse-Produktdokumentation)Parallel Data Warehouse product documentation. Mit diesem Hinweis kann die Leistung verbessert werden, wenn beim Abfrageplan eine Übertragungs-Verschiebung verwendet wird, um einen verteilungsinkompatiblen Join zu beseitigen.This hint can improve performance when the query plan is using a broadcast move to resolve a distribution incompatible join.

JOINJOIN
Legt fest, dass die angegebene Joinoperation mit den angegebenen Tabellenquellen oder Sichten durchgeführt werden soll.Indicates that the specified join operation should occur between the specified table sources or views.

ON <search_condition>ON <search_condition>
Gibt die Bedingung an, auf der der Join basiert.Specifies the condition on which the join is based. Als Bedingung können beliebige Prädikate angegeben werden, obwohl häufig Spalten- und Vergleichsoperatoren verwendet werden, z. B.:The condition can specify any predicate, although columns and comparison operators are frequently used, for example:

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

Wenn in der Bedingung Spalten angegeben werden, müssen die Spalten nicht denselben Namen oder Datentyp aufweisen. Die Datentypen müssen jedoch, wenn sie nicht identisch sind, kompatibel sein oder von SQL ServerSQL Server implizit konvertiert werden können.When the condition specifies columns, the columns do not have to have the same name or same data type; however, if the data types are not the same, they must be either compatible or types that SQL ServerSQL Server can implicitly convert. Wenn die Datentypen nicht implizit konvertiert werden können, muss die Bedingung den Datentyp mithilfe der CONVERT-Funktion explizit konvertieren.If the data types cannot be implicitly converted, the condition must explicitly convert the data type by using the CONVERT function.

Es kann Prädikate geben, die sich auf nur eine der verknüpften Tabellen beziehen, die in der ON-Klausel angegeben sind.There can be predicates that involve only one of the joined tables in the ON clause. Derartige Prädikate können auch in der WHERE-Klausel der Abfrage stehen.Such predicates also can be in the WHERE clause in the query. Bei einem inneren Join (INNER JOIN) spielt es keine Rolle, wo diese Prädikate stehen. Bei einem äußeren Join (OUTER JOIN) können derartige Prädikate dagegen zu unterschiedlichen Ergebnissen führen.Although the placement of such predicates does not make a difference for INNER joins, they might cause a different result when OUTER joins are involved. Dies liegt daran, dass die in der ON-Klausel angegebenen Prädikate vor dem Join auf die Tabelle angewendet werden, während die WHERE-Klausel semantisch auf das Ergebnis des Joins angewendet wird.This is because the predicates in the ON clause are applied to the table before the join, whereas the WHERE clause is semantically applied to the result of the join.

Weitere Informationen zu Suchbedingungen und Prädikaten finden Sie unter Suchbedingung (Transact-SQL).For more information about search conditions and predicates, see Search Condition (Transact-SQL).

CROSS JOINCROSS JOIN
Gibt das Kreuzprodukt zweier Tabellen an.Specifies the cross-product of two tables. Gibt dieselben Zeilen wie die frühere Joinanweisung (die nicht SQL-92-gemäß ist) ohne WHERE-Klausel zurück.Returns the same rows as if no WHERE clause was specified in an old-style, non-SQL-92-style join.

left_table_source { CROSS | OUTER } APPLY right_table_sourceleft_table_source { CROSS | OUTER } APPLY right_table_source
Gibt an, dass der right_table_source-Ausdruck des APPLY-Operators für jede Zeile des left_table_source-Ausdrucks ausgewertet wird.Specifies that the right_table_source of the APPLY operator is evaluated against every row of the left_table_source. Diese Funktionalität ist hilfreich, wenn right_table_source eine Tabellenwertfunktion enthält, die Spaltenwerte aus left_table_source als eines ihrer Argumente verwendet.This functionality is useful when the right_table_source contains a table-valued function that takes column values from the left_table_source as one of its arguments.

Mit APPLY muss CROSS oder OUTER angegeben werden.Either CROSS or OUTER must be specified with APPLY. Wenn CROSS angegeben wird, werden keine Zeilen erstellt, wenn right_table_source für eine bestimmte Zeile von left_table_source ausgewertet wird. Das zurückgegebene Resultset ist leer.When CROSS is specified, no rows are produced when the right_table_source is evaluated against a specified row of the left_table_source and returns an empty result set.

Wenn OUTER angegeben wird, wird für jede Zeile von left_table_source eine Zeile erstellt, selbst dann wenn right_table_source für diese Zeile ausgewertet wird. Das zurückgegebene Resultset ist leer.When OUTER is specified, one row is produced for each row of the left_table_source even when the right_table_source evaluates against that row and returns an empty result set.

Weitere Informationen finden Sie im Abschnitt mit Hinweisen.For more information, see the Remarks section.

left_table_sourceleft_table_source
Eine Tabellenquelle gemäß Definition im vorherigen Argument.Is a table source as defined in the previous argument. Weitere Informationen finden Sie im Abschnitt mit Hinweisen.For more information, see the Remarks section.

right_table_sourceright_table_source
Eine Tabellenquelle gemäß Definition im vorherigen Argument.Is a table source as defined in the previous argument. Weitere Informationen finden Sie im Abschnitt mit Hinweisen.For more information, see the Remarks section.

PIVOT-KlauselPIVOT clause

table_source PIVOT <pivot_clause>table_source PIVOT <pivot_clause>
Gibt an, dass table_source basierend auf pivot_column pivotiert wird.Specifies that the table_source is pivoted based on the pivot_column. table_source ist eine Tabelle oder ein Tabellenausdruck.table_source is a table or table expression. Die Ausgabe ist eine Tabelle, die alle Spalten von table_source enthält mit Ausnahme von pivot_column und value_column.The output is a table that contains all columns of the table_source except the pivot_column and value_column. Die Spalten von table_source mit Ausnahme von pivot_column und value_column werden als Gruppierungsspalten des PIVOT-Operators bezeichnet.The columns of the table_source, except the pivot_column and value_column, are called the grouping columns of the pivot operator. Weitere Informationen zu PIVOT und UNPIVOT finden Sie unter Verwenden von PIVOT und UNPIVOT.For more information about PIVOT and UNPIVOT, see Using PIVOT and UNPIVOT.

PIVOT führt einen Gruppierungsvorgang für die Eingabetabelle in Bezug auf die Gruppierungsspalten aus und gibt für jede Gruppe eine Zeile zurück.PIVOT performs a grouping operation on the input table with regard to the grouping columns and returns one row for each group. Zusätzlich enthält die Ausgabe eine Spalte für jeden Wert, der in column_list angegeben ist. Diese Liste wird in der pivot_column-Spalte der input_table-Tabelle angezeigt.Additionally, the output contains one column for each value specified in the column_list that appears in the pivot_column of the input_table.

Weitere Informationen finden Sie im nachfolgenden Abschnitt mit Hinweisen.For more information, see the Remarks section that follows.

aggregate_functionaggregate_function
Eine system- oder benutzerdefinierte Aggregatfunktion, die mindestens eine Eingabe akzeptiert.Is a system or user-defined aggregate function that accepts one or more inputs. Die Aggregatfunktion muss bezüglich NULL-Werten invariant sein.The aggregate function should be invariant to null values. Eine bezüglich NULL-Werten invariante Aggregatfunktion berücksichtigt beim Auswerten des Aggregatwerts keine NULL-Werte in der Gruppe.An aggregate function invariant to null values does not consider null values in the group while it is evaluating the aggregate value.

Die systembasierte Aggregatfunktion COUNT(*) ist nicht zulässig.The COUNT(*) system aggregate function is not allowed.

value_columnvalue_column
Die Wertspalte des PIVOT-Operators.Is the value column of the PIVOT operator. Bei Verwendung mit UNPIVOT kann value_column nicht der Name einer vorhandenen Spalte in der table_source-Eingabe sein.When used with UNPIVOT, value_column cannot be the name of an existing column in the input table_source.

FOR pivot_columnFOR pivot_column
Entspricht der Pivotspalte des PIVOT-Operators.Is the pivot column of the PIVOT operator. pivot_column muss einen Typ aufweisen, der implizit oder explizit in nvarchar() konvertiert werden kann.pivot_column must be of a type implicitly or explicitly convertible to nvarchar(). Diese Spalte darf nicht vom Typ image oder rowversion sein.This column cannot be image or rowversion.

Wenn UNPIVOT verwendet wird, ist pivot_column der Name der Ausgabespalte, zu der table_source eingeschränkt wird.When UNPIVOT is used, pivot_column is the name of the output column that becomes narrowed from the table_source. In table_source darf es keine vorhandene Spalte mit diesem Namen geben.There cannot be an existing column in table_source with that name.

IN (column_list )IN (column_list )
Führt in der PIVOT-Klausel die Werte in der pivot_column-Spalte auf, die zu den Spaltennamen der Ausgabetabelle werden.In the PIVOT clause, lists the values in the pivot_column that will become the column names of the output table. In der Liste können keine Spaltennamen angegeben werden, die bereits in der zu pivotierenden table_source-Eingabe vorhanden sind.The list cannot specify any column names that already exist in the input table_source that is being pivoted.

Führt in der UNPIVOT-Klausel die Spalten in table_source auf, die zu einer einzelnen pivot_column-Spalte eingeschränkt werden.In the UNPIVOT clause, lists the columns in table_source that will be narrowed into a single pivot_column.

table_aliastable_alias
Entspricht dem Aliasnamen der Ausgabetabelle.Is the alias name of the output table. pivot_table_alias muss angegeben werden.pivot_table_alias must be specified.

UNPIVOT <unpivot_clause>UNPIVOT <unpivot_clause>
Gibt an, dass die Eingabetabelle aus mehreren Spalten in column_list zu einer einzelnen Spalte namens pivot_column eingeschränkt wird.Specifies that the input table is narrowed from multiple columns in column_list into a single column called pivot_column. Weitere Informationen zu PIVOT und UNPIVOT finden Sie unter Verwenden von PIVOT und UNPIVOT.For more information about PIVOT and UNPIVOT, see Using PIVOT and UNPIVOT.

AS OF <date_time>AS OF <date_time>

Gilt für: SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis SQL Server 2017SQL Server 2017 und SQL-DatenbankSQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL-DatenbankSQL Database.

Gibt eine Tabelle mit einem einzelnen Datensatz für jede Zeile zurück, die die Werte enthält, die zum angegebenen Zeitpunkt in der Vergangenheit real (aktuell) waren.Returns a table with single record for each row containing the values that were actual (current) at the specified point in time in the past. Intern wird eine Union zwischen der temporalen Tabelle und ihrer Verlaufstabelle ausgeführt, und die Ergebnisse werden so gefiltert, dass die Werte in der Zeile zurückgegeben werden, die zu dem durch den Parameter <date_time> angegebenen Zeitpunkt gültig waren.Internally, a union is performed between the temporal table and its history table and the results are filtered to return the values in the row that was valid at the point in time specified by the <date_time> parameter. Der Wert für eine Zeile ist gültig, wenn der Wert system_start_time_column_name kleiner als oder gleich dem Parameterwert <date_time> und der Wert system_end_time_column_name größer als der Parameterwert <date_time> ist.The value for a row is deemed valid if the system_start_time_column_name value is less than or equal to the <date_time> parameter value and the system_end_time_column_name value is greater than the <date_time> parameter value.

FROM <start_date_time> TO <end_date_time>FROM <start_date_time> TO <end_date_time>

Gilt für: SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis SQL Server 2017SQL Server 2017 und SQL-DatenbankSQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL-DatenbankSQL Database.

Gibt eine Tabelle mit den Werten für alle Zeilenversionen zurück, die innerhalb des angegebenen Zeitbereichs aktiv waren, unabhängig davon, ob ihre Aktivität vor dem <start_date_time>-Parameterwert für das FROM-Argument begonnen hat oder ihre Aktivität nach dem <end_date_time>-Parameterwert für das TO-Argument geendet hat.Returns a table with the values for all record versions that were active within the specified time range, regardless of whether they started being active before the <start_date_time> parameter value for the FROM argument or ceased being active after the <end_date_time> parameter value for the TO argument. Intern wird eine Union zwischen der temporalen Tabelle und ihrer Verlaufstabelle ausgeführt, und die Ergebnisse werden so gefiltert, dass die Werte für alle Zeilenversionen zurückgegeben werden, die zu irgendeinem Zeitpunkt innerhalb des angegebenen Zeitbereichs aktiv waren.Internally, a union is performed between the temporal table and its history table and the results are filtered to return the values for all row versions that were active at any time during the time range specified. Zeilen, die genau an dem durch den FROM-Endpunkt definierten unteren Grenzwert aktiv wurden, sind enthalten, und Datensätze, die genau an dem durch den TO-Endpunkt definierten oberen Grenzwert aktiv wurden, sind nicht enthalten.Rows that became active exactly on the lower boundary defined by the FROM endpoint are included and rows that became active exactly on the upper boundary defined by the TO endpoint are not included.

BETWEEN <start_date_time> AND <end_date_time>BETWEEN <start_date_time> AND <end_date_time>

Gilt für: SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis SQL Server 2017SQL Server 2017 und SQL-DatenbankSQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL-DatenbankSQL Database.

Gleich wie oben in der Beschreibung zu FROM <start_date_time> TO <end_date_time>, mit dem Unterschied, dass sie Zeilen enthält, die an dem durch den <end_date_time>-Endpunkt definierten oberen Grenzwert aktiv wurden.Same as above in the FROM <start_date_time> TO <end_date_time> description, except it includes rows that became active on the upper boundary defined by the <end_date_time> endpoint.

CONTAINED IN (<start_date_time> , <end_date_time>)CONTAINED IN (<start_date_time> , <end_date_time>)

Gilt für: SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis SQL Server 2017SQL Server 2017 und SQL-DatenbankSQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL-DatenbankSQL Database.

Gibt eine Tabelle mit den Werten für alle Datensatzversionen zurück, die innerhalb des von den zwei Datums-/Uhrzeitwerten für das Argument CONTAINED IN definierten Zeitbereichs geöffnet und geschlossen wurden.Returns a table with the values for all record versions that were opened and closed within the specified time range defined by the two datetime values for the CONTAINED IN argument. Zeilen, die genau beim unteren Grenzwert aktiv wurden, oder deren Aktivität genau beim oberen Grenzwert endete, sind enthalten.Rows that became active exactly on the lower boundary or ceased being active exactly on the upper boundary are included.

ALLALL
Gibt eine Tabelle mit den Werten aus allen Zeilen aus der aktuellen Tabelle und aus der Verlaufstabelle zurück.Returns a table with the values from all rows from both the current table and the history table.

RemarksRemarks

Die FROM-Klausel unterstützt die SQL-Syntax von SQL-92 für verknüpfte und abgeleitete Tabellen.The FROM clause supports the SQL-92-SQL syntax for joined tables and derived tables. Die SQL-92-Syntax stellt die Joinoperatoren INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER und CROSS zur Verfügung.SQL-92 syntax provides the INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER, and CROSS join operators.

UNION und JOIN in einer FROM-Klausel werden in Sichten, abgeleiteten Tabellen und Unterabfragen unterstützt.UNION and JOIN within a FROM clause are supported within views and in derived tables and subqueries.

Ein Selbstjoin ist eine Tabelle, die mit sich selbst verknüpft ist.A self-join is a table that is joined to itself. Vorgänge zum Einfügen und Aktualisieren, die auf einem Selbstjoin basieren, werden gemäß Reihenfolge der FROM-Klausel ausgeführt.Insert or update operations that are based on a self-join follow the order in the FROM clause.

Da SQL ServerSQL Server Verteilungs- und Kardinalitätsstatistiken von Verbindungsservern berücksichtigt, die Spaltenverteilungsstatistiken bereitstellen, ist der REMOTE-Joinhinweis nicht erforderlich, um eine Remotebewertung eines Joins zu erzwingen.Because SQL ServerSQL Server considers distribution and cardinality statistics from linked servers that provide column distribution statistics, the REMOTE join hint is not required to force evaluating a join remotely. Der SQL ServerSQL Server-Abfrageprozessor berücksichtigt Remotestatistiken und bestimmt, ob eine Remotejoinstrategie geeignet ist.The SQL ServerSQL Server query processor considers remote statistics and determines whether a remote-join strategy is appropriate. Der REMOTE-Joinhinweis ist für Anbieter nützlich, die keine Spaltenverteilungsstatistiken bereitstellen.REMOTE join hint is useful for providers that do not provide column distribution statistics.

Verwenden von APPLYUsing APPLY

Der linke und der rechte Operand des APPLY-Operators sind Tabellenausdrücke.Both the left and right operands of the APPLY operator are table expressions. Der Hauptunterschied zwischen diesen Operanden besteht darin, dass right_table_source eine Tabellenwertfunktion verwenden kann, die eine Spalte aus left_table_source als eines der Argumente der Funktion verwendet.The main difference between these operands is that the right_table_source can use a table-valued function that takes a column from the left_table_source as one of the arguments of the function. left_table_source kann Tabellenwertfunktionen einschließen. Dieser Operand kann allerdings keine Argumente enthalten, die Spalten aus right_table_source sind.The left_table_source can include table-valued functions, but it cannot contain arguments that are columns from the right_table_source.

Der APPLY-Operator funktioniert folgendermaßen, um die Tabellenquelle für die FROM-Klausel zu produzieren:The APPLY operator works in the following way to produce the table source for the FROM clause:

  1. Wertet right_table_source für alle Zeilen von left_table_source aus, um Rowsets zu erstellen.Evaluates right_table_source against each row of the left_table_source to produce rowsets.

    Die Werte in right_table_source hängen von left_table_source ab.The values in the right_table_source depend on left_table_source. right_table_source lässt sich etwa folgendermaßen darstellen: TVF(left_table_source.row), wobei TVF eine Tabellenwertfunktion ist.right_table_source can be represented approximately this way: TVF(left_table_source.row), where TVF is a table-valued function.

  2. Kombiniert die Resultsets, die für die einzelnen Zeilen in der Auswertung von right_table_source mit left_table_source unter Ausführung eines UNION ALL-Vorgangs erstellt werden.Combines the result sets that are produced for each row in the evaluation of right_table_source with the left_table_source by performing a UNION ALL operation.

    Die Liste der Spalten, die durch das Ergebnis des APPLY-Operators erstellt wurde, ist die Gruppe der Spalten aus left_table_source, die mit der Liste der Spalten aus right_table_source kombiniert wird.The list of columns produced by the result of the APPLY operator is the set of columns from the left_table_source that is combined with the list of columns from the right_table_source.

Verwenden von PIVOT und UNPIVOTUsing PIVOT and UNPIVOT

Bei pivot_column und value_column handelt es sich um Gruppierungsspalten, die vom PIVOT-Operator verwendet werden.The pivot_column and value_column are grouping columns that are used by the PIVOT operator. PIVOT führt dabei die folgenden Schritte aus, um das Ausgaberesultset zu erhalten:PIVOT follows the following process to obtain the output result set:

  1. Führt einen GROUP BY-Vorgang für input_table für die Gruppierungsspalten aus und produziert eine Ausgabespalte für jede Gruppe.Performs a GROUP BY on its input_table against the grouping columns and produces one output row for each group.

    Die Gruppierungsspalten in der Ausgabespalte erhalten für diese Gruppe in input_table die entsprechenden Spaltenwerte.The grouping columns in the output row obtain the corresponding column values for that group in the input_table.

  2. Generiert folgendermaßen Werte für die Spalten in der Spaltenliste für jede Ausgabezeile:Generates values for the columns in the column list for each output row by performing the following:

    1. Zusätzliches Gruppieren der Zeilen für pivot_column, die im vorherigen Schritt in GROUP BY generiert wurden.Grouping additionally the rows generated in the GROUP BY in the previous step against the pivot_column.

      Auswählen einer Untergruppe für jede Ausgabespalte in column_list. Die Untergruppe erfüllt folgende Bedingung:For each output column in the column_list, selecting a subgroup that satisfies the condition:

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

    2. aggregate_function wird für value_column bei dieser Untergruppe ausgewertet. Das Ergebnis wird als der Wert der entsprechenden output_column-Spalte ausgegeben.aggregate_function is evaluated against the value_column on this subgroup and its result is returned as the value of the corresponding output_column. Wenn die Untergruppe leer ist, generiert SQL ServerSQL Server einen NULL-Wert für diese output_column-Spalte.If the subgroup is empty, SQL ServerSQL Server generates a null value for that output_column. Wenn die Aggregatfunktion COUNT ist und die Untergruppe leer ist, wird null (0) zurückgegeben.If the aggregate function is COUNT and the subgroup is empty, zero (0) is returned.

Hinweis

Die Spaltenbezeichner in der UNPIVOT-Klausel folgen der Katalogsortierung.The column identifiers in the UNPIVOT clause follow the catalog collation. Bei SQL-DatenbankSQL Database wird immer die Sortierung SQL_Latin1_General_CP1_CI_AS verwendet.For SQL-DatenbankSQL Database, the collation is always SQL_Latin1_General_CP1_CI_AS. Bei teilweise eigenständigen SQL ServerSQL Server-Datenbanken wird immer die Sortierung Latin1_General_100_CI_AS_KS_WS_SC verwendet.For SQL ServerSQL Server partially contained databases, the collation is always Latin1_General_100_CI_AS_KS_WS_SC. Wenn die Spalte mit anderen Spalten kombiniert wird, ist eine COLLATE-Klausel (COLLATE DATABASE_DEFAULT) erforderlich, um Konflikte zu vermeiden.If the column is combined with other columns, then a collate clause (COLLATE DATABASE_DEFAULT) is required to avoid conflicts.

Weitere Informationen zu PIVOT und UNPIVOT sowie entsprechende Beispiele finden Sie unter Verwenden von PIVOT und UNPIVOT.For more information about PIVOT and UNPIVOT including examples, see Using PIVOT and UNPIVOT.

BerechtigungenPermissions

Erfordert die Berechtigungen für die DELETE-, SELECT- oder UPDATE-Anweisung.Requires the permissions for the DELETE, SELECT, or UPDATE statement.

BeispieleExamples

A.A. Verwenden einer einfachen FROM-KlauselUsing a simple FROM clause

Im folgenden Beispiel werden die TerritoryID- und Name-Spalten aus der SalesTerritory-Tabelle in der AdventureWorks2012AdventureWorks2012-Beispieldatenbank abgerufen.The following example retrieves the TerritoryID and Name columns from the SalesTerritory table in the AdventureWorks2012AdventureWorks2012 sample database.

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

Im Folgenden finden Sie das Resultset.Here is the result set.

TerritoryID Name                            
----------- ------------------------------  
1           Northwest                       
2           Northeast                       
3           Central                         
4           Southwest                       
5           Southeast                       
6           Canada                          
7           France                          
8           Germany                         
9           Australia                       
10          United Kingdom                  
(10 row(s) affected)  

B.B. Verwenden der TABLOCK- und HOLDLOCK-OptimierungshinweiseUsing the TABLOCK and HOLDLOCK optimizer hints

Die folgende Teiltransaktion zeigt, wie eine explizite freigegebene Tabellensperre auf die Employee-Tabelle angewendet und der Index gelesen wird.The following partial transaction shows how to place an explicit shared table lock on Employee and how to read the index. Die Sperre bleibt während der gesamten Transaktion bestehen.The lock is held throughout the whole transaction.

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

C.C. Verwenden der SQL-92-CROSS JOIN-SyntaxUsing the SQL-92 CROSS JOIN syntax

Im folgenden Beispiel wird das Kreuzprodukt der beiden Tabellen Employee und Department in der AdventureWorks2012AdventureWorks2012-Datenbank zurückgegeben.The following example returns the cross product of the two tables Employee and Department in the AdventureWorks2012AdventureWorks2012 database. Eine Liste aller möglichen Kombinationen der BusinessEntityID-Zeilen und aller Department-Namenszeilen wird zurückgegeben.A list of all possible combinations of BusinessEntityID rows and all Department name rows are returned.

SELECT e.BusinessEntityID, d.Name AS Department  
FROM HumanResources.Employee AS e  
CROSS JOIN HumanResources.Department AS d  
ORDER BY e.BusinessEntityID, d.Name ;  

D.D. Verwenden der SQL-92-FULL OUTER JOIN-SyntaxUsing the SQL-92 FULL OUTER JOIN syntax

Im folgenden Beispiel werden der Produktname und alle zugehörigen Kaufaufträge in der SalesOrderDetail-Tabelle in der AdventureWorks2012AdventureWorks2012-Datenbank zurückgegeben.The following example returns the product name and any corresponding sales orders in the SalesOrderDetail table in the AdventureWorks2012AdventureWorks2012 database. Außerdem werden Kaufaufträge zurückgegeben, für die kein Produkt in der Product-Tabelle aufgeführt ist. Darüber hinaus werden Produkte mit einem anderen Kaufauftrag als dem in der Product-Tabelle aufgeführten Kaufauftrag zurückgegeben.It also returns any sales orders that have no product listed in the Product table, and any products with a sales order other than the one listed in the Product table.

-- The OUTER keyword following the FULL keyword is optional.  
SELECT p.Name, sod.SalesOrderID  
FROM Production.Product AS p  
FULL OUTER JOIN Sales.SalesOrderDetail AS sod  
ON p.ProductID = sod.ProductID  
ORDER BY p.Name ;  

E.E. Verwenden der SQL-92 LEFT OUTER JOIN-SyntaxUsing the SQL-92 LEFT OUTER JOIN syntax

Im folgenden Beispiel werden zwei Tabellen über ProductID verknüpft und die nicht entsprechenden Zeilen aus der linken Tabelle aufbewahrt.The following example joins two tables on ProductID and preserves the unmatched rows from the left table. Die Product-Tabelle wird mit der SalesOrderDetail-Tabelle über die ProductID-Spalten in den beiden Tabellen verglichen.The Product table is matched with the SalesOrderDetail table on the ProductID columns in each table. Im Resultset werden alle bestellten und nicht bestellten Produkte angezeigt.All products, ordered and not ordered, appear in the result set.

SELECT p.Name, sod.SalesOrderID  
FROM Production.Product AS p  
LEFT OUTER JOIN Sales.SalesOrderDetail AS sod  
ON p.ProductID = sod.ProductID  
ORDER BY p.Name ;  

F.F. Verwenden der SQL-92-INNER JOIN-SyntaxUsing the SQL-92 INNER JOIN syntax

Im folgenden Beispiel werden alle Produktnamen und Verkaufsauftragsnummern zurückgegeben.The following example returns all product names and sales order IDs.

-- By default, SQL Server performs an INNER JOIN if only the JOIN   
-- keyword is specified.  
SELECT p.Name, sod.SalesOrderID  
FROM Production.Product AS p  
INNER JOIN Sales.SalesOrderDetail AS sod  
ON p.ProductID = sod.ProductID  
ORDER BY p.Name ;  

G.G. Verwenden der SQL-92-RIGHT OUTER JOIN-SyntaxUsing the SQL-92 RIGHT OUTER JOIN syntax

Im folgenden Beispiel werden zwei Tabellen über TerritoryID verknüpft und die nicht entsprechenden Zeilen aus der rechten Tabelle aufbewahrt.The following example joins two tables on TerritoryID and preserves the unmatched rows from the right table. Die SalesTerritory-Tabelle wird mit der SalesPerson-Tabelle über die TerritoryID-Spalte in den beiden Tabellen verglichen.The SalesTerritory table is matched with the SalesPerson table on the TerritoryID column in each table. Im Resultset werden alle Vertriebsmitarbeiter unabhängig davon aufgeführt, ob ihnen ein Gebiet zugewiesen ist.All salespersons appear in the result set, whether or not they are assigned a territory.

SELECT st.Name AS Territory, sp.BusinessEntityID  
FROM Sales.SalesTerritory AS st   
RIGHT OUTER JOIN Sales.SalesPerson AS sp  
ON st.TerritoryID = sp.TerritoryID ;  

H.H. Verwenden von HASH- und MERGE-JoinhinweisenUsing HASH and MERGE join hints

Im folgenden Beispiel werden die drei Tabellen Product, ProductVendor und Vendor verknüpft, um eine Liste der Produkte und deren Anbieter zu produzieren.The following example performs a three-table join among the Product, ProductVendor, and Vendor tables to produce a list of products and their vendors. Der Abfrageoptimierer verknüpft Product und ProductVendor (p und pv) mit einem MERGE-Join.The query optimizer joins Product and ProductVendor (p and pv) by using a MERGE join. Das Ergebnis des MERGE-Joins von Product und ProductVendor (p und pv) wird mit der Vendor-Tabelle verknüpft und ergibt (p und pv) und v. Dabei wird ein HASH-Join angewendet.Next, the results of the Product and ProductVendor MERGE join (p and pv) are HASH joined to the Vendor table to produce (p and pv) and v.

Wichtig

Nach Angabe eines Joinhinweises muss das INNER-Schlüsselwort für jeder auszuführende innere Join explizit angegeben werden.After a join hint is specified, the INNER keyword is no longer optional and must be explicitly stated for an INNER JOIN to be performed.

SELECT p.Name AS ProductName, v.Name AS VendorName  
FROM Production.Product AS p   
INNER MERGE JOIN Purchasing.ProductVendor AS pv   
ON p.ProductID = pv.ProductID  
INNER HASH JOIN Purchasing.Vendor AS v  
ON pv.BusinessEntityID = v.BusinessEntityID  
ORDER BY p.Name, v.Name ;  

I.I. Verwenden einer abgeleiteten TabelleUsing a derived table

Im folgenden Beispiel wird eine abgeleitete Tabelle verwendet. Mit einer SELECT-Anweisung nach der FROM-Klausel werden die Vor- und Nachnamen aller Mitarbeiter und ihre Wohnorte zurückgegeben.The following example uses a derived table, a SELECT statement after the FROM clause, to return the first and last names of all employees and the cities in which they live.

SELECT RTRIM(p.FirstName) + ' ' + LTRIM(p.LastName) AS Name, d.City  
FROM Person.Person AS p  
INNER JOIN HumanResources.Employee e ON p.BusinessEntityID = e.BusinessEntityID   
INNER JOIN  
   (SELECT bea.BusinessEntityID, a.City   
    FROM Person.Address AS a  
    INNER JOIN Person.BusinessEntityAddress AS bea  
    ON a.AddressID = bea.AddressID) AS d  
ON p.BusinessEntityID = d.BusinessEntityID  
ORDER BY p.LastName, p.FirstName;  

J.J. Verwenden von TABLESAMPLE, um Daten von einem Beispiel für Zeilen in einer Tabelle zu lesenUsing TABLESAMPLE to read data from a sample of rows in a table

Im folgenden Beispiel wird TABLESAMPLE in der FROM-Klausel verwendet, um ungefähr 10-Prozent aller Zeilen in der Customer-Tabelle zurückzugeben.The following example uses TABLESAMPLE in the FROM clause to return approximately 10 percent of all the rows in the Customer table.

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

K.K. Verwenden von APPLYUsing APPLY

Im folgenden Beispiel wird vorausgesetzt, dass die folgenden Tabellen und Tabellenwertfunktionen in der Datenbank vorhanden sind:The following example assumes that the following tables and table-valued function exist in the database:

ObjektnamenObject Name SpaltennamenColumn Names
AbteilungenDepartments DeptID, DivisionID, DeptName, DeptMgrIDDeptID, DivisionID, DeptName, DeptMgrID
EmpMgrEmpMgr MgrID, EmpIDMgrID, EmpID
EmployeesEmployees EmpID, EmpLastName, EmpFirstName, EmpSalaryEmpID, EmpLastName, EmpFirstName, EmpSalary
GetReports(MgrID)GetReports(MgrID) EmpID, EmpLastName, EmpSalaryEmpID, EmpLastName, EmpSalary

Die Tabellenwertfunktion GetReports gibt eine Liste aller dem angegebenen MgrID direkt oder indirekt unterstellten Mitarbeiter zurück.The GetReports table-valued function, returns the list of all employees that report directly or indirectly to the specified MgrID.

Im Beispiel werden mit APPLY alle Abteilungen und alle Mitarbeiter in dieser Abteilung zurückgegeben.The example uses APPLY to return all departments and all employees in that department. Wenn eine bestimmte Abteilung keine Mitarbeiter hat, werden für diese Abteilung keine Zeilen zurückgegeben.If a particular department does not have any employees, there will not be any rows returned for that department.

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

Wenn die Abfrage Zeilen für diese Abteilungen ohne Mitarbeiter produzieren soll, die NULL-Werte für die Spalten EmpID, EmpLastName und EmpSalary produziert, verwenden Sie stattdessen OUTER APPLY.If you want the query to produce rows for those departments without employees, which will produce null values for the EmpID, EmpLastName and EmpSalary columns, use OUTER APPLY instead.

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

L.L. Verwenden von CROSS APPLYUsing CROSS APPLY

Im folgenden Beispiel wird eine Momentaufnahme aller im Plancache gespeicherten Abfragen abgerufen, indem die dynamische Verwaltungssicht sys.dm_exec_cached_plans abgefragt wird, um die Planhandles aller Abfragepläne im Cache abzurufen.The following example retrieves a snapshot of all query plans residing in the plan cache, by querying the sys.dm_exec_cached_plans dynamic management view to retrieve the plan handles of all query plans in the cache. Dann wird der CROSS APPLY-Operator angegeben, um die Planhandles an sys.dm_exec_query_plan zu übergeben.Then the CROSS APPLY operator is specified to pass the plan handles to sys.dm_exec_query_plan. Die XML-Showplanausgabe für jeden aktuell im Plancache gespeicherten Plan wird in der query_plan -Spalte der zurückgegebenen Tabelle angezeigt.The XML Showplan output for each plan currently in the plan cache is in the query_plan column of the table that is returned.

USE master;  
GO  
SELECT dbid, object_id, query_plan   
FROM sys.dm_exec_cached_plans AS cp   
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle);   
GO  

M.M. Verwenden von FOR SYSTEM_TIMEUsing FOR SYSTEM_TIME

Gilt für: SQL Server 2016 (13.x)SQL Server 2016 (13.x) bis SQL Server 2017SQL Server 2017 und SQL-DatenbankSQL Database.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) through SQL Server 2017SQL Server 2017 and SQL-DatenbankSQL Database.

Im folgenden Beispiel wird das Argument FOR SYSTEM_TIME AS OF date_time_literal_or_variable verwendet, um Tabellenzeilen zurückzugeben, die am 1. Januar 2014 aktuell waren.The following example uses the FOR SYSTEM_TIME AS OF date_time_literal_or_variable argument to return table rows that were actual (current) as of January 1, 2014.

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

Im folgenden Beispiel wird das Argument „FOR SYSTEM_TIME FROM date_time_literal_or_variable TO date_time_literal_or_variable“ verwendet, um alle Zeilen zurückzugeben, die in dem Zeitraum aktiv waren, für dessen Beginn der 1. Januar 2013 und für dessen Ende der 1. Januar 2014 ohne oberen Grenzwert definiert wurde.The following example uses the FOR SYSTEM_TIME FROM date_time_literal_or_variable TO date_time_literal_or_variable argument to return all rows that were active during the period defined as starting with January 1, 2013 and ending with January 1, 2014, exclusive of the upper boundary.

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

Im folgenden Beispiel wird das Argument FOR SYSTEM_TIME BETWEEN date_time_literal_or_variable AND date_time_literal_or_variable verwendet, um alle Zeilen zurückzugeben, die in dem Zeitraum aktiv waren, für dessen Beginn der 1. Januar 2013 und für dessen Ende der 1. Januar 2014 mit oberem Grenzwert definiert wurde.The following example uses the FOR SYSTEM_TIME BETWEEN date_time_literal_or_variable AND date_time_literal_or_variable argument to return all rows that were active during the period defined as starting with January 1, 2013 and ending with January 1, 2014, inclusive of the upper boundary.

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

Im folgenden Beispiel wird das Argument FOR SYSTEM_TIME CONTAINED IN ( date_time_literal_or_variable, date_time_literal_or_variable ) verwendet, um alle Zeilen zurückzugeben, die in dem Zeitraum geöffnet und geschlossen wurden, für dessen Beginn der 1. Januar 2013 und für dessen Ende der 1. Januar 2014 definiert wurde.The following example uses the FOR SYSTEM_TIME CONTAINED IN ( date_time_literal_or_variable, date_time_literal_or_variable ) argument to return all rows that were opened and closed during the period defined as starting with January 1, 2013 and ending with January 1, 2014.

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

Im folgenden Beispiel wird anstelle eines Literals eine Variable verwendet, um die Datumsgrenzwerte für die Abfrage bereitzustellen.The following example uses a variable rather than a literal to provide the date boundary values for the query.

DECLARE @AsOfFrom datetime2 = dateadd(month,-12, sysutcdatetime());
DECLARE @AsOfTo datetime2 = dateadd(month,-6, sysutcdatetime());

SELECT DepartmentNumber,   
    DepartmentName,   
    ManagerID,   
    ParentDepartmentNumber   
FROM DEPARTMENT  
FOR SYSTEM_TIME FROM @AsOfFrom TO @AsOfTo  
WHERE ManagerID = 5;

Beispiele: Azure SQL Data WarehouseAzure SQL Data Warehouse und Parallel Data WarehouseParallel Data Warehouse.Examples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

N.N. Verwenden der INNER JOIN-SyntaxUsing the INNER JOIN syntax

Im folgenden Beispiel werden die Spalten SalesOrderNumber, ProductKey und EnglishProductName aus den Tabellen FactInternetSales und DimProduct zurückgegeben, wobei der Joinschlüssel ProductKey in beiden Tabellen übereinstimmt.The following example returns the SalesOrderNumber, ProductKey, and EnglishProductName columns from the FactInternetSales and DimProduct tables where the join key, ProductKey, matches in both tables. Die Spalten SalesOrderNumber und EnglishProductName sind nur in einer der Tabellen vorhanden. Daher muss mit diesen Spalten kein Tabellenalias angegeben werden. Diese Aliase werden lediglich aus Gründen der besseren Lesbarkeit eingefügt.The SalesOrderNumber and EnglishProductName columns each exist in one of the tables only, so it is not necessary to specify the table alias with these columns, as is shown; these aliases are included for readability. Das Wort AS vor einem Aliasnamen ist nicht erforderlich, wird jedoch aus Gründen der besseren Lesbarkeit sowie zur Einhaltung des ANSI-Standards empfohlen.The word AS before an alias name is not required but is recommended for readability and to conform to the ANSI standard.

-- Uses AdventureWorks  

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

Da das Schlüsselwort INNER für innere Joins nicht benötigt wird, kann diese Abfrage auch wie folgt formuliert werden:Since the INNER keyword is not required for inner joins, this same query could be written as:

-- Uses AdventureWorks  

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

Eine WHERE-Klausel kann zur Begrenzung der Ergebnisse auch mit der folgenden Abfrage verwendet werden.A WHERE clause could also be used with this query to limit results. In diesem Beispiel werden die Ergebnisse auf SalesOrderNumber-Werte begrenzt, die größer als 'SO5000' sind:This example limits results to SalesOrderNumber values higher than ‘SO5000’:

-- Uses AdventureWorks  

SELECT fis.SalesOrderNumber, dp.ProductKey, dp.EnglishProductName  
FROM FactInternetSales AS fis 
JOIN DimProduct AS dp  
    ON dp.ProductKey = fis.ProductKey  
WHERE fis.SalesOrderNumber > 'SO50000'  
ORDER BY fis.SalesOrderNumber;  

O.O. Verwenden der LEFT OUTER JOIN- und RIGHT OUTER JOIN-SyntaxUsing the LEFT OUTER JOIN and RIGHT OUTER JOIN syntax

Im folgenden Beispiel werden die Tabellen FactInternetSales und DimProduct in den ProductKey-Spalten verknüpft.The following example joins the FactInternetSales and DimProduct tables on the ProductKey columns. In der LEFT OUTER JOIN-Syntax werden die Zeilen ohne Entsprechung aus der linken Tabelle (FactInternetSales) beibehalten.The left outer join syntax preserves the unmatched rows from the left (FactInternetSales) table. Da die FactInternetSales-Tabelle nur ProductKey-Werte enthält, die mit der DimProduct-Tabelle übereinstimmen, gibt diese Abfrage dieselben Zeilen wie im Beispiel für den inneren Join weiter oben zurück.Since the FactInternetSales table does not contain any ProductKey values that do not match the DimProduct table, this query returns the same rows as the first inner join example above.

-- Uses AdventureWorks  

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

Diese Abfrage kann auch ohne das Schlüsselwort OUTER formuliert werden.This query could also be written without the OUTER keyword.

In der RIGHT OUTER JOIN-Syntax werden Zeilen ohne Entsprechung aus der rechten Tabelle beibehalten.In right outer joins, the unmatched rows from the right table are preserved. Im folgenden Beispiel werden dieselben Zeilen wie im Beispiel für den linken äußeren Join weiter oben zurückgegeben.The following example returns the same rows as the left outer join example above.

-- Uses AdventureWorks  

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

In der folgenden Abfrage wird die DimSalesTerritory-Tabelle als linke Tabelle in einem linken äußeren Join verwendet.The following query uses the DimSalesTerritory table as the left table in a left outer join. Die SalesOrderNumber-Werte werden aus der FactInternetSales-Tabelle abgerufen.It retrieves the SalesOrderNumber values from the FactInternetSales table. Wenn für einen bestimmten SalesTerritoryKey-Schlüssel keine Aufträge vorliegen, gibt die Abfrage für diese Zeile für SalesOrderNumber NULL zurück.If there are no orders for a particular SalesTerritoryKey, the query will return a NULL for the SalesOrderNumber for that row. Diese Abfrage wird nach der SalesOrderNumber-Spalte sortiert, sodass NULL-Werte in dieser Spalte oben in den Ergebnissen angezeigt werden.This query is ordered by the SalesOrderNumber column, so that any NULLs in this column will appear at the top of the results.

-- Uses AdventureWorks  

SELECT dst.SalesTerritoryKey, dst.SalesTerritoryRegion, fis.SalesOrderNumber  
FROM DimSalesTerritory AS dst 
LEFT OUTER JOIN FactInternetSales AS fis  
    ON dst.SalesTerritoryKey = fis.SalesTerritoryKey  
ORDER BY fis.SalesOrderNumber;  

Diese Abfrage kann mit einem rechten äußeren Join neu geschrieben werden, um dieselben Ergebnisse abzurufen:This query could be rewritten with a right outer join to retrieve the same results:

-- Uses AdventureWorks  

SELECT dst.SalesTerritoryKey, dst.SalesTerritoryRegion, fis.SalesOrderNumber  
FROM FactInternetSales AS fis 
RIGHT OUTER JOIN DimSalesTerritory AS dst  
    ON fis.SalesTerritoryKey = dst.SalesTerritoryKey  
ORDER BY fis.SalesOrderNumber;  

P.P. Verwenden der FULL OUTER JOIN-SyntaxUsing the FULL OUTER JOIN syntax

Im folgenden Beispiel ist ein vollständiger äußerer Join dargestellt, der alle Zeilen aus beiden verknüpften Tabellen zurückgibt, jedoch für Werte ohne Entsprechung in der anderen Tabelle NULL zurückgibt.The following example demonstrates a full outer join, which returns all rows from both joined tables but returns NULL for values that do not match from the other table.

-- Uses AdventureWorks  

SELECT dst.SalesTerritoryKey, dst.SalesTerritoryRegion, fis.SalesOrderNumber  
FROM DimSalesTerritory AS dst 
FULL OUTER JOIN FactInternetSales AS fis  
    ON dst.SalesTerritoryKey = fis.SalesTerritoryKey  
ORDER BY fis.SalesOrderNumber;  

Diese Abfrage kann auch ohne das Schlüsselwort OUTER formuliert werden.This query could also be written without the OUTER keyword.

-- Uses AdventureWorks  

SELECT dst.SalesTerritoryKey, dst.SalesTerritoryRegion, fis.SalesOrderNumber  
FROM DimSalesTerritory AS dst 
FULL JOIN FactInternetSales AS fis  
    ON dst.SalesTerritoryKey = fis.SalesTerritoryKey  
ORDER BY fis.SalesOrderNumber;  

Q.Q. Verwenden der CROSS JOIN-SyntaxUsing the CROSS JOIN syntax

Im folgenden Beispiel wird das Kreuzprodukt der Tabellen FactInternetSales und DimSalesTerritory zurückgegeben.The following example returns the cross-product of the FactInternetSales and DimSalesTerritory tables. Eine Liste aller möglichen Kombinationen von SalesOrderNumber und SalesTerritoryKey wird zurückgegeben.A list of all possible combinations of SalesOrderNumber and SalesTerritoryKey are returned. Beachten Sie, dass in der Cross Join-Abfrage die ON-Klausel fehlt.Notice the absence of the ON clause in the cross join query.

-- Uses AdventureWorks  

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

R.R. Verwenden einer abgeleiteten TabelleUsing a derived table

Im folgenden Beispiel wird eine abgeleitete Tabelle (eine SELECT-Anweisung nach der FROM-Klausel) verwendet, um die Spalten CustomerKey und LastName aller Kunden in der Tabelle DimCustomer zurückzugeben, bei denen die BirthDate-Werte nach dem 1. Januar 1970 liegen und für den Nachnamen "Smith" angegeben ist.The following example uses a derived table (a SELECT statement after the FROM clause) to return the CustomerKey and LastName columns of all customers in the DimCustomer table with BirthDate values later than January 1, 1970 and the last name ‘Smith’.

-- Uses AdventureWorks  

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

S.S. Beispiel für einen REDUCE-JoinhinweisREDUCE join hint example

Im folgenden Beispiel wird der REDUCE-Joinhinweis verwendet, um die Verarbeitung der abgeleiteten Tabelle in der Abfrage zu ändern.The following example uses the REDUCE join hint to alter the processing of the derived table within the query. Wenn in dieser Abfrage der REDUCE-Joinhinweis verwendet wird, wird fis.ProductKey projiziert, repliziert und unterscheidbar gemacht und anschließend beim Mischen von DimProduct in ProductKey mit DimProduct verknüpft.When using the REDUCE join hint in this query, the fis.ProductKey is projected, replicated and made distinct, and then joined to DimProduct during the shuffle of DimProduct on ProductKey. Die resultierende abgeleitete Tabelle wird in fis.ProductKey verteilt.The resulting derived table is distributed on fis.ProductKey.

-- Uses AdventureWorks  

EXPLAIN SELECT SalesOrderNumber  
FROM  
   (SELECT fis.SalesOrderNumber, dp.ProductKey, dp.EnglishProductName  
    FROM DimProduct AS dp   
      INNER REDUCE JOIN FactInternetSales AS fis   
          ON dp.ProductKey = fis.ProductKey  
   ) AS dTable  
ORDER BY SalesOrderNumber;  

T.T. Beispiel für einen REPLICATE-JoinhinweisREPLICATE join hint example

Im folgenden Beispiel wird dieselbe Abfrage wie im vorherigen Beispiel verwendet, jedoch mit der Ausnahme, dass anstelle des REDUCE-Joinhinweises ein REPLICATE-Joinhinweis verwendet wird.This next example shows the same query as the previous example, except that a REPLICATE join hint is used instead of the REDUCE join hint. Wenn der REPLICATE-Hinweis verwendet wird, werden die Werte in der Verknüpfungsspalte ProductKey aus der Tabelle FactInternetSales auf allen Knoten repliziert.Use of the REPLICATE hint causes the values in the ProductKey (joining) column from the FactInternetSales table to be replicated to all nodes. Die Tabelle DimProduct wird mit der replizierten Version dieser Werte verknüpft.The DimProduct table is joined to the replicated version of those values.

-- Uses AdventureWorks  

EXPLAIN SELECT SalesOrderNumber  
FROM  
   (SELECT fis.SalesOrderNumber, dp.ProductKey, dp.EnglishProductName  
    FROM DimProduct AS dp   
      INNER REPLICATE JOIN FactInternetSales AS fis  
          ON dp.ProductKey = fis.ProductKey  
   ) AS dTable  
ORDER BY SalesOrderNumber;  

U.U. Verwenden des REDISTRIBUTE-Hinweises zur Gewährleistung einer Verschiebung mit Vermischung für einen verteilungsinkompatiblen JoinUsing the REDISTRIBUTE hint to guarantee a Shuffle move for a distribution incompatible join

In der folgenden Abfrage wird der REDISTRIBUTE-Abfragehinweis in einem verteilungsinkompatiblen Join verwendet.The following query uses the REDISTRIBUTE query hint on a distribution incompatible join. Dadurch wird sichergestellt, dass der Abfrageoptimierer im Abfrageplan eine Verschiebung mit Vermischung verwendet.This guarantees the query optimizer will use a Shuffle move in the query plan. Ferner wird dadurch sichergestellt, dass im Abfrageplan keine Übertragungs-Verschiebung verwendet wird, bei der eine verteilte Tabelle in eine replizierte Tabelle verschoben wird.This also guarantees the query plan will not use a Broadcast move which moves a distributed table to a replicated table.

Im folgenden Beispiel erzwingt der REDISTRIBUTE-Hinweis in der FactInternetSales-Tabelle eine Verschiebung mit Vermischung, weil ProductKey die Verteilungsspalte für DimProduct und nicht die Verteilungsspalte für FactInternetSales ist.In the following example, the REDISTRIBUTE hint forces a Shuffle move on the FactInternetSales table because ProductKey is the distribution column for DimProduct, and is not the distribution column for FactInternetSales.

-- Uses AdventureWorks  

EXPLAIN  
SELECT dp.ProductKey, fis.SalesOrderNumber, fis.TotalProductCost  
FROM DimProduct AS dp 
INNER REDISTRIBUTE JOIN FactInternetSales AS fis  
    ON dp.ProductKey = fis.ProductKey;  

V.V. Verwenden von TABLESAMPLE, um Daten von einem Beispiel für Zeilen in einer Tabelle zu lesenUsing TABLESAMPLE to read data from a sample of rows in a table

Im folgenden Beispiel wird TABLESAMPLE in der FROM-Klausel verwendet, um ungefähr 10-Prozent aller Zeilen in der Customer-Tabelle zurückzugeben.The following example uses TABLESAMPLE in the FROM clause to return approximately 10 percent of all the rows in the Customer table.

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

Weitere Informationen finden Sie unterSee Also

CONTAINSTABLE (Transact-SQL) CONTAINSTABLE (Transact-SQL)
DELETE (Transact-SQL) DELETE (Transact-SQL)
FREETEXTTABLE (Transact-SQL) FREETEXTTABLE (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
OPENQUERY (Transact-SQL) OPENQUERY (Transact-SQL)
OPENROWSET (Transact-SQL) OPENROWSET (Transact-SQL)
Operatoren (Transact-SQL) Operators (Transact-SQL)
UPDATE (Transact-SQL) UPDATE (Transact-SQL)
WHERE (Transact-SQL)WHERE (Transact-SQL)