FROM (Entity SQL)
Gibt die in SELECT-Anweisungen verwendete Sammlung an
Syntax
FROM expression [ ,...n ] AS C
Argumente
expression
Jeder gültige, eine Auflistung zurückgebende Abfrageausdruck, die als Quelle in einer SELECT
-Anweisung verwendet werden kann.
Bemerkungen
Eine FROM
-Klausel ist eine durch Kommas getrennte Liste von einem oder mehreren FROM
-Klauselelementen. Die FROM
-Klausel kann verwendet werden, um eine oder mehrere Quellen für eine SELECT
-Anweisung anzugeben. Die einfachste Form einer FROM
-Klausel ist ein einzelner, eine Auflistung und ein Alias festlegender Abfrageausdruck, der als Quelle in einer SELECT
-Anweisung verwendet wird, wie im folgenden Beispiel veranschaulicht:
FROM C as c
FROM-Klauselelemente
Jedes FROM
-Klauselelement verweist auf eine Quellsammlung in der Entity SQL-Abfrage. Entity SQL unterstützt die folgenden Klassen von FROM
-Klauselelementen: einfache FROM
-Klauselelemente,JOIN FROM
-Klauselelemente und APPLY FROM
-Klauselelemente. Jedes dieser FROM
-Klauselelemente wird in den folgenden Abschnitten ausführlicher beschrieben.
Einfaches FROM-Klauselelement
Das einfachste FROM
-Klauselelement ist ein einzelner Ausdruck, der eine Auflistung und einen Alias identifiziert. Bei dem Ausdruck kann es sich einfach um eine Entitätenmenge, eine Unterabfrage oder um einen anderen Ausdruck vom Auflistungstyp handeln. Es folgt ein Beispiel:
LOB.Customers as c
Die Aliasspezifikation ist optional. Eine alternative Spezifikation vom oben erwähnten FROM-Klauselelement finden Sie im Folgenden:
LOB.Customers
Wenn kein Alias angegeben wird, erzeugt Entity SQL auf der Grundlage des Sammlungsausdrucks einen Alias.
JOIN FROM-Klauselelement
Ein JOIN FROM
-Klauselelement stellt einen Join zwischen zwei FROM
-Klauselelementen dar. Entity SQL unterstützt Kreuzprodukte, innere Joins, linke und rechte äußere Verknüpfungen und vollständige äußere Joins. Diese Verknüpfungen werden alle auf ähnliche Weise unterstützt wie in Transact-SQL. Wie in Transact-SQL müssen die beiden für FROM
verwendeten JOIN
-Klauselelemente unabhängig sein. Sie können demnach nicht korreliert werden. Für diese Fälle kann CROSS APPLY
oder OUTER APPLY
verwendet werden.
Cross Joins
Ein CROSS JOIN
-Abfrageausdruck erzeugt das kartesische Produkt der beiden Auflistungen, wie im folgenden Beispiel veranschaulicht:
FROM C AS c CROSS JOIN D as d
Inner Joins
INNER JOIN
erzeugt ein eingeschränktes kartesisches Produkt der beiden Auflistungen, wie im folgenden Beispiel veranschaulicht:
FROM C AS c [INNER] JOIN D AS d ON e
Der vorige Abfrageausdruck verarbeitet eine Kombination aller Elemente der linken Auflistung gepaart mit jedem Element der rechten Auflistung, wenn die ON
-Bedingung "true" ist. Wenn keine ON
-Bedingung angegeben wird, degeneriert ein INNER JOIN
zu einem CROSS JOIN
.
Linke äußere Verknüpfungen und rechte äußere Verknüpfungen
Ein OUTER JOIN
-Abfrageausdruck erzeugt ein eingeschränktes kartesisches Produkt der beiden Auflistungen, wie im folgenden Beispiel veranschaulicht:
FROM C AS c LEFT OUTER JOIN D AS d ON e
Der vorige Abfrageausdruck verarbeitet eine Kombination aller Elemente der linken Auflistung gepaart mit jedem Element der rechten Auflistung, wenn die ON
-Bedingung "true" ist. Wenn die ON
-Bedingung "false" ist, verarbeitet der Ausdruck eine einzelne Instanz des linken Elements gepaart mit dem rechten Element mit dem Wert Null.
Ein RIGHT OUTER JOIN
kann auf eine ähnliche Weise ausgedrückt werden.
Full Outer Joins
Ein expliziter FULL OUTER JOIN
erzeugt ein eingeschränktes kartesisches Produkt der beiden Auflistungen, wie im folgenden Beispiel veranschaulicht:
FROM C AS c FULL OUTER JOIN D AS d ON e
Der vorige Abfrageausdruck verarbeitet eine Kombination aller Elemente der linken Auflistung gepaart mit jedem Element der rechten Auflistung, wenn die ON
-Bedingung "true" ist. Wenn die ON
-Bedingung "false" ist, verarbeitet der Ausdruck eine Instanz des linken Elements gepaart mit dem rechten Element mit dem Wert NULL. Außerdem wird eine Instanz des rechten Elements gepaart mit dem linken Element mit dem Wert NULL verarbeitet.
Hinweis
In Transact-SQL ist das OUTER-Schlüsselwort optional, um die Kompatibilität mit SQL-92 beizubehalten. LEFT JOIN
, RIGHT JOIN
und FULL JOIN
sind daher Synonyme für LEFT OUTER JOIN
, RIGHT OUTER JOIN
und FULL OUTER JOIN
.
APPLY-Klauselelement
Entity SQL unterstützt zwei Typen von APPLY
: CROSS APPLY
und OUTER APPLY
.
Ein CROSS APPLY
erzeugt eine eindeutige Kombination aller Elemente der linken Auflistung mit einem Element der rechten Auflistung, indem der rechte Ausdruck ausgewertet wird. Mit CROSS APPLY
ist der rechte Ausdruck funktional abhängig vom linken Element, wie das folgende Beispiel für eine zugeordnete Auflistung veranschaulicht:
SELECT c, f FROM C AS c CROSS APPLY c.Assoc AS f
Das Verhalten von CROSS APPLY
ähnelt der Verknüpfungsliste. Wenn der rechte Ausdruck als leere Auflistung ausgewertet wird, erzeugt CROSS APPLY
für diese Instanz des linken Elements keine Paarungen.
OUTER APPLY
ähnelt CROSS APPLY
, abgesehen davon, dass eine Paarung auch dann erzeugt wird, wenn der rechte Ausdruck als leere Auflistung ausgewertet wird. Im Folgenden finden Sie ein Beispiel für ein OUTER APPLY
.
SELECT c, f FROM C AS c OUTER APPLY c.Assoc AS f
Hinweis
Im Unterschied zu Transact-SQL ist in Entity SQL kein unnest-Schritt erforderlich.
Hinweis
CROSS
- und OUTER APPLY
-Operatoren wurden in SQL Server 2005 eingeführt. In einigen Fällen kann die Abfragepipeline Transact-SQL erzeugen, die CROSS APPLY
- und/oder OUTER APPLY
-Operatoren enthält. Da einige Back-End-Anbieter, einschließlich Versionen von SQL Server vor SQL Server 2005, diese Operatoren nicht unterstützen, können solche Abfragen nicht auf diesen Back-End-Anbietern ausgeführt werden.
Typische Szenarios, in denen CROSS APPLY
- und/oder OUTER APPLY
-Operatoren in der Ausgabeabfrage vorhanden sein können, sind beispielsweise korrelierte Unterabfragen mit Paging, AnyElement über einer korrelierten Unterabfrage oder über einer durch Navigation erzeugten Auflistung, LINQ-Abfragen, die Elementselektoren akzeptierende Gruppierungsmethoden verwenden, Abfragen, für die ein CROSS APPLY
oder ein OUTER APPLY
explizit angegeben wurden oder Abfragen, die ein DEREF
-Konstrukt über einem REF
-Konstrukt enthalten.
Mehrere Auflistungen in der FROM-Klausel
Die FROM
-Klausel kann mehrere durch Kommas getrennte Auflistungen enthalten. In diesem Fall wird davon ausgegangen, dass die Auflistungen verknüpft sind. Dies ist vergleichbar mit einem n-fachen CROSS JOIN.
Im folgenden Beispiel sind C
und D
unabhängige Sammlungen, c.Names
ist jedoch von C
abhängig.
FROM C AS c, D AS d, c.Names AS e
Das vorherige Beispiel ist mit dem folgenden Beispiel logisch äquivalent:
FROM (C AS c JOIN D AS d) CROSS APPLY c.Names AS e
Linke Korrelation
Elemente in der FROM
-Klausel können auf in früheren Klauseln angegebene Elemente verweisen. Im folgenden Beispiel sind C
und D
unabhängige Auflistungen, c.Names
ist jedoch von C
abhängig:
from C as c, D as d, c.Names as e
Dies ist logisch äquivalent zu:
from (C as c join D as d) cross apply c.Names as e
Semantik
Es wird logisch davon ausgegangen, dass die Auflistungen in der FROM
-Klausel zu einem n
-fachen Cross Join gehören (außer im Fall eines einfachen Cross Join). Aliase werden in der FROM
-Klausel von links nach rechts verarbeitet und dem aktuellen Gültigkeitsbereich hinzugefügt, um später auf sie verweisen zu können. Es wird angenommen, dass die FROM
-Klausel ein Zeilenmultiset erzeugt. Für jedes Objekt in der FROM
-Klausel ist ein Feld vorhanden, dass ein einzelnes Element dieser Auflistung darstellt.
Die FROM
-Klausel erzeugt logisch eine Zeilenmultimenge vom Row(c, d, e)-Typ. Es wird angenommen, dass die Felder c, d und e den Elementtyp C
, D
und c.Names
aufweisen.
Entity SQL führt einen Alias für jedes einfache FROM
-Klauselelement im Bereich ein. Im folgenden FROM-Klauselausschnitt sind die im Bereich eingeführten Namen beispielsweise c, d und e.
from (C as c join D as d) cross apply c.Names as e
In Entity SQL (im Gegensatz zu Transact-SQL) führt die FROM
-Klausel nur die Aliase im Bereich ein. Alle Verweise auf Spalten (Eigenschaften) dieser Auflistungen müssen mit dem Alias qualifiziert werden.
Ausführen von Pull-Vorgängen für Schlüssel aus geschachtelten Abfragen
Bestimmte Typen von Abfragen, die die Ausführung von Pull-Vorgängen für Schlüssel aus einer geschachtelten Abfrage erfordern, werden nicht unterstützt. Beispielsweise ist die folgende Abfrage gültig:
select c.Orders from Customers as c
Die folgende Abfrage ist jedoch ungültig, da die geschachtelte Abfrage nicht über Schlüssel verfügt:
select {1} from {2, 3}