Partager via


FROM (Entity SQL)

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

Syntaxe

FROM expression [ ,...n ] AS C

Arguments

expression
Toute expression de requête valide qui produit une collection à utiliser comme source dans une instruction SELECT.

Notes

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

FROM C as c

Éléments de clause FROM

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

Élément de clause FROM simple

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

LOB.Customers as c

La spécification d'un alias est facultative. Une autre spécification de l'élément de clause FROM pourrait être la suivante :

LOB.Customers

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

Élément de clause JOIN FROM

Un élément de clause JOIN FROM représente une jointure entre deux éléments de clause FROM. Entity SQL prend en charge les jointures croisées, les jointures internes, les jointures externes gauches et droites, ainsi que les jointures externes entières. Toutes ces jointures sont prises en charge de la même manière qu’elles le sont dans Transact-SQL. Comme dans Transact-SQL, les deux éléments de clause FROM impliqués dans la jointure JOIN doivent être indépendants. Autrement dit, ils ne peuvent pas être corrélés. Un CROSS APPLY ou un OUTER APPLY peut être utilisé pour ces cas.

Jointures croisées

Une expression de requête CROSS JOIN génère le produit cartésien des deux collections, comme illustré dans l’exemple suivant :

FROM C AS c CROSS JOIN D as d

Jointures internes

Un INNER JOIN génère un produit cartésien limité 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 condition ON est vérifiée (True). Si aucune condition ON n'est spécifiée, un INNER JOIN dégénère en CROSS JOIN.

Jointures externes gauches et jointures externes droites

Une expression de requête OUTER JOIN génère 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 condition ON est vérifiée (True). Si la condition ON n'est pas vérifiée (False), l'expression traite tout de même une instance unique de l'élément à gauche associé à l'élément à droite, avec la valeur Null.

Un RIGHT OUTER JOIN peut être exprimé de la même manière.

Jointures externes entières

Un FULL OUTER JOIN explicite génère 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 condition ON est vérifiée (True). Si la condition ON n'est pas vérifiée (False), l'expression traite tout de même une instance de l'élément à gauche associé à l'élément à droite, avec la valeur Null. Il traite également une instance de l'élément à droite associé à l'élément à gauche, avec la valeur Null.

Notes

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

Élément de clause APPLY

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

Un CROSS APPLY produit un appariement unique de chaque élément de la collection située à gauche avec un élément de la collection produite en évaluant l’expression située à 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 de CROSS APPLY est semblable à la liste de jointures. Si l’expression à droite correspond à une collection vide, le CROSS APPLY ne produit pas d’appariement pour cette instance de l’élément à gauche.

Un OUTER APPLY ressemble à un CROSS APPLY, excepté qu’un appariement est toujours produit même quand l’expression à droite correspond à une collection vide. Voici un exemple de OUTER APPLY :

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

Notes

Contrairement à Transact-SQL, aucune étape de désimbrication explicite n’est nécessaire dans Entity SQL.

Notes

Les opérateurs CROSS et OUTER APPLY ont été introduits dans SQL Server 2005. Dans certains cas, le pipeline de requête peut produire une instruction Transact-SQL qui contient des opérateurs CROSS APPLY et/ou OUTER APPLY. Dans la mesure où certains fournisseurs back-end, notamment dans les versions de SQL Server antérieures à SQL Server 2005, ne prennent pas en charge ces opérateurs, de telles requêtes ne peuvent pas être exécutées sur ces fournisseurs.

Voici certains scénarios classiques susceptibles d’aboutir à la présence d’opérateurs CROSS APPLY et/ou OUTER APPLY dans la requête de sortie : 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 navigation, requêtes LINQ qui utilisent des méthodes de regroupement acceptant un sélecteur d’élément, une requête dans laquelle un CROSS APPLY ou un OUTER APPLY sont spécifiés explicitement, une requête qui a une construction DEREF sur une construction REF.

Collections multiples dans la clause FROM

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

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 équivaut logiquement à l'exemple suivant :

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

Corrélation de gauche

Les éléments dans la clause FROM peuvent faire référence à des éléments spécifiés dans des clauses antérieures. 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

Cela équivaut logiquement à :

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

Sémantique

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

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

Entity SQL introduit un alias pour chaque élément de clause FROM simple de l’étendue. Par exemple, dans l'extrait 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 clause FROM introduit uniquement les alias dans l’étendue. Toutes les références à des colonnes (propriétés) de ces collections doivent être qualifiées avec l'alias.

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

Certains types des requêtes qui requièrent l'appel 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