Partager via


FROM (Entity SQL)

Spécifie la collection utilisée dans les instructions SELECT .

Syntaxe

FROM expression [ ,...n ] AS C

Les arguments

expression
Toute expression de requête valide qui génère une collection à utiliser comme source dans une SELECT instruction.

Remarques

Une FROM clause est une liste séparée par des virgules d’un ou FROM plusieurs éléments de clause. La FROM clause peut être utilisée pour spécifier une ou plusieurs sources pour une SELECT instruction. La forme la plus simple d’une FROM clause est une expression de requête unique qui identifie une collection et un alias utilisé comme source dans une SELECT instruction, comme illustré dans l’exemple suivant :

FROM C as c

Éléments de clause FROM

Chaque FROM élément de clause fait référence à une collection source dans la requête Entity SQL. Entity SQL prend en charge les classes suivantes d’éléments de clause : éléments de FROM clause simples FROM , JOIN FROM éléments de clause et APPLY FROM éléments de clause. Chacun de ces FROM éléments de clause est décrit plus en détail dans les sections suivantes.

Élément de clause FROM simple

L’élément de clause le plus simple FROM est une expression unique qui identifie une collection et un alias. L’expression peut simplement être un jeu d’entités ou une sous-requête, ou toute autre expression qui est un type de collection. Voici un exemple :

LOB.Customers as c

La spécification de l’alias est facultative. Une autre spécification de l’élément de clause ci-dessus peut être la suivante :

LOB.Customers

Si aucun alias n’est spécifié, Entity SQL tente de générer un alias basé sur l’expression de collection.

Élément de clause JOIN FROM

Un JOIN FROM élément de clause représente une jointure entre deux FROM éléments de clause. Entity SQL prend en charge les jointures croisées, les jointures internes, les jointures externes gauche et droite et les jointures externes complètes. Toutes ces jointures sont prises en charge de la façon dont elles sont prises en charge dans Transact-SQL. Comme dans Transact-SQL, les deux FROM éléments de clause impliqués dans le JOIN fichier doivent être indépendants. Autrement dit, elles ne peuvent pas être corrélées. Une CROSS APPLY ou OUTER APPLY peut être utilisée pour ces cas.

Jointures croisées

Une CROSS JOIN expression de requête produit le produit cartesien des deux collections, comme illustré dans l’exemple suivant :

FROM C AS c CROSS JOIN D as d

Jointures internes

Un INNER JOIN produit cartésien contraint des deux collections, comme illustré dans l’exemple suivant :

FROM C AS c [INNER] JOIN D AS d ON e

L’expression de requête précédente traite une combinaison de chaque élément de la collection à gauche associé à chaque élément de la collection à droite, où la ON condition est vraie. Si aucune condition n’est ON spécifiée, une INNER JOIN dégénérée à un CROSS JOIN.

Jointures externes gauches et jointures externes droites

Une OUTER JOIN expression de requête produit un produit cartésien limité des deux collections, comme illustré dans l’exemple suivant :

FROM C AS c LEFT OUTER JOIN D AS d ON e

L’expression de requête précédente traite une combinaison de chaque élément de la collection à gauche associé à chaque élément de la collection à droite, où la ON condition est vraie. Si la ON condition est false, l’expression traite toujours une seule instance de l’élément sur la gauche associée à l’élément à droite, avec la valeur Null.

Une RIGHT OUTER JOIN expression peut être exprimée de manière similaire.

Jointures externes complètes

Un produit FULL OUTER JOIN explicite produit un produit cartésien limité des deux collections, comme illustré dans l’exemple suivant :

FROM C AS c FULL OUTER JOIN D AS d ON e

L’expression de requête précédente traite une combinaison de chaque élément de la collection à gauche associé à chaque élément de la collection à droite, où la ON condition est vraie. Si la ON condition est false, l’expression traite toujours une instance de l’élément sur la gauche associée à l’élément à droite, avec la valeur Null. Il traite également une instance de l’élément sur la droite associée à l’élément sur la gauche, avec la valeur Null.

Remarque

Pour préserver la compatibilité avec SQL-92, dans Transact-SQL le mot clé OUTER est facultatif. Par conséquent, LEFT JOIN, RIGHT JOINet FULL JOIN sont synonymes pour LEFT OUTER JOIN, RIGHT OUTER JOINet FULL OUTER JOIN.

APPLY, élément de clause

Entity SQL prend en charge deux types de APPLY: CROSS APPLY et OUTER APPLY.

Un CROSS APPLY produit un couplage unique de chaque élément de la collection à gauche avec un élément de la collection produit en évaluant l’expression à droite. Avec un CROSS APPLY, l’expression à droite dépend fonctionnellement de l’élément à gauche, comme illustré dans l’exemple de collection associé suivant :

SELECT c, f FROM C AS c CROSS APPLY c.Assoc AS f

Le comportement est CROSS APPLY similaire à la liste de jointures. Si l’expression à droite prend la valeur d’une collection vide, elle CROSS APPLY ne produit aucune association pour cette instance de l’élément à gauche.

Un OUTER APPLY ressemble à un CROSS APPLY, à l’exception d’un jumelage est toujours produit même lorsque l’expression sur la droite évalue à une collection vide. Voici un exemple de OUTER APPLY:

SELECT c, f FROM C AS c OUTER APPLY c.Assoc AS f

Remarque

Contrairement à Transact-SQL, il n’est pas nécessaire d’effectuer une étape explicite dans Entity SQL.

Remarque

CROSS et OUTER APPLY les opérateurs ont été introduits dans SQL Server 2005. Dans certains cas, le pipeline de requête peut produire des Transact-SQL qui contiennent CROSS APPLY et/ou OUTER APPLY des opérateurs. Étant donné que certains fournisseurs principaux, y compris les versions de SQL Server antérieures à SQL Server 2005, ne prennent pas en charge ces opérateurs, ces requêtes ne peuvent pas être exécutées sur ces fournisseurs principaux.

Certains scénarios classiques qui peuvent entraîner la présence d’opérateurs et/ou OUTER APPLY de CROSS APPLY présence dans la requête de sortie sont les suivants : une sous-requête corrélée avec la pagination ; AnyElement sur une sous-requête corrélée ou sur une collection produite par la navigation ; Requêtes LINQ qui utilisent des méthodes de regroupement qui acceptent un sélecteur d’élément ; requête dans laquelle une CROSS APPLY ou une requête OUTER APPLY est spécifiée explicitement ; requête qui a une DEREF construction sur une REF construction.

Plusieurs collections dans la clause FROM

La FROM clause peut contenir plusieurs collections séparées par des virgules. Dans ces cas, les collections sont supposées être jointes. Considérez-les comme un CROSS JOIN n way.

Dans l’exemple suivant, C et D sont des collections indépendantes, mais c.Names dépend de C.

FROM C AS c, D AS d, c.Names AS e

L’exemple précédent est logiquement équivalent à l’exemple suivant :

FROM (C AS c JOIN D AS d) CROSS APPLY c.Names AS e

Corrélation gauche

Les éléments de la FROM clause peuvent faire référence aux éléments spécifiés dans les clauses antérieures. Dans l’exemple suivant, C et D sont des collections indépendantes, mais c.Names dépendent des éléments Csuivants :

from C as c, D as d, c.Names as e

Cela équivaut logiquement à :

from (C as c join D as d) cross apply c.Names as e

Sémantique

Logiquement, les collections de la FROM clause sont supposées faire partie d’une njointure croisée -way (sauf dans le cas d’une jointure croisée de 1 sens). Les alias de la FROM clause sont traités de gauche à droite et sont ajoutés à l’étendue actuelle pour référence ultérieure. La FROM clause est supposée produire un multiset de lignes. Il y aura un champ pour chaque élément de la FROM clause qui représente un élément unique de cet élément de collection.

La FROM clause produit logiquement un multiset de lignes de type Row(c, d, e) où les champs c, d et e sont supposés être du type d’élément , CDet c.Names.

Entity SQL introduit un alias pour chaque élément de clause simple FROM dans l’étendue. Par exemple, dans l’extrait de code de clause FROM suivant, les noms introduits dans l’étendue sont c, d et e.

from (C as c join D as d) cross apply c.Names as e

Dans Entity SQL (contrairement à Transact-SQL), la FROM clause introduit uniquement les alias dans l’étendue. Toutes les références aux colonnes (propriétés) de ces collections doivent être qualifiées avec l’alias.

Extraction de clés à partir de requêtes imbriquées

Certains types de requêtes qui nécessitent l’extraction de clés à partir d’une requête imbriquée ne sont pas pris en charge. Par exemple, la requête suivante est valide :

select c.Orders from Customers as c

Toutefois, la requête suivante n’est pas valide, car la requête imbriquée n’a pas de clés :

select {1} from {2, 3}

Voir aussi