FROM (Entity SQL)

Specifica la raccolta usata nelle istruzioni SELECT.

Sintassi

FROM expression [ ,...n ] AS C

Argomenti

expression
Qualsiasi espressione di query valida che produce una raccolta da usare come origine in un'istruzione SELECT.

Osservazioni:

Una clausola FROM è un elenco delimitato da virgole di uno o più elementi della clausola FROM. La clausola FROM può essere usata per specificare una o più origini per un'istruzione SELECT. Il tipo più semplice di clausola FROM consiste in una singola espressione di query che identifica una raccolta e un alias usati come origine in un'istruzione SELECT, come illustrato nell'esempio seguente:

FROM C as c

Elementi della clausola FROM

Ogni elemento della clausola FROM si riferisce a una raccolta di origine nella query Entity SQL. Entity SQL supporta le classi seguenti di elementi della clausola FROM: elementi della clausola FROM semplici, elementi della clausola JOIN FROM ed elementi della clausola APPLY FROM. Nelle sezioni seguenti è disponibile una descrizione più dettagliata per ognuno di questi elementi della clausola FROM.

Elemento della clausola FROM semplice

L'elemento della clausola FROM più semplice è dato da una singola espressione che identifica una raccolta e un alias. L'espressione può consistere semplicemente in un set di entità, o subquery, o in qualsiasi altra espressione corrispondente a un tipo di raccolta. Di seguito è riportato un esempio:

LOB.Customers as c

La specifica dell'alias è facoltativa. Di seguito è riportato un esempio di specifica alternativa per l'elemento della clausola FROM precedente:

LOB.Customers

Se non viene specificato alcun alias, in Entity SQL viene eseguito un tentativo di generare un alias in base all'espressione della raccolta.

Elemento della clausola JOIN FROM

Un elemento della clausola JOIN FROM rappresenta un join tra due elementi della clausola FROM. Entity SQL supporta cross join, inner join, left e right outer join e full outer join. Il supporto di questi join presenta caratteristiche analoghe a quelle del supporto offerto da Transact-SQL. Come in Transact-SQL, i due elementi della clausola FROM inclusi nell'oggetto JOIN devono essere indipendenti. In altre parole, non possono essere correlati. In questi casi è possibile usare una clausola CROSS APPLY o OUTER APPLY.

Cross join

Un'espressione di query CROSS JOIN genera il prodotto cartesiano di due raccolte, come illustrato nell'esempio seguente:

FROM C AS c CROSS JOIN D as d

Inner join

Un INNER JOIN genera un prodotto cartesiano vincolato di due raccolte, come illustrato nell'esempio seguente:

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

L'espressione di query precedente elabora una combinazione di ogni elemento della raccolta a sinistra abbinato a ogni elemento della raccolta a destra, in cui la condizione ON è vera. Se non è specificata alcuna condizione ON, un INNER JOIN degenera in un CROSS JOIN.

Left outer join e right outer join

Un'espressione di query OUTER JOIN genera un prodotto cartesiano vincolato di due raccolte, come illustrato nell'esempio seguente:

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

L'espressione di query precedente elabora una combinazione di ogni elemento della raccolta a sinistra abbinato a ogni elemento della raccolta a destra, in cui la condizione ON è vera. Se la condizione ON è falsa, l'espressione elabora comunque una sola istanza dell'elemento a sinistra abbinato all'elemento a destra con valore Null.

Un RIGHT OUTER JOIN può essere espresso in modo simile.

Full Outer Join

Un FULL OUTER JOIN esplicito genera un prodotto cartesiano vincolato di due raccolte, come illustrato nell'esempio seguente:

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

L'espressione di query precedente elabora una combinazione di ogni elemento della raccolta a sinistra abbinato a ogni elemento della raccolta a destra, in cui la condizione ON è vera. Se la condizione ON è falsa, l'espressione elabora comunque una sola istanza dell'elemento a sinistra abbinato all'elemento a destra con valore Null. Elabora inoltre una sola istanza dell'elemento a destra abbinato all'elemento a sinistra con valore Null.

Nota

Per mantenere la compatibilità con SQL-92, in Transact-SQL la parola chiave OUTER è facoltativa. Pertanto, LEFT JOIN, RIGHT JOIN e FULL JOIN sono sinonimi di LEFT OUTER JOIN, RIGHT OUTER JOIN e FULL OUTER JOIN.

Elemento della clausola APPLY

Entity SQL supporta due tipi di elementi APPLY: CROSS APPLY e OUTER APPLY.

Una clausola CROSS APPLY produce un abbinamento univoco di ogni elemento della raccolta a sinistra con un elemento della raccolta prodotto dalla valutazione dell'espressione a destra. Con una clausola CROSS APPLY, l'espressione a destra dipende dal punto di vista funzionale dall'elemento a sinistra, come illustrato nell'esempio di raccolta associata seguente:

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

Il comportamento di CROSS APPLY è simile a quello dell'elenco di join. Se l'espressione a destra restituisce una raccolta vuota, CROSS APPLY non produce abbinamenti per quell'istanza dell'elemento a sinistra.

Una clausola OUTER APPLY è simile a una CROSS APPLY, ad eccezione del fatto che viene prodotto un abbinamento anche se l'espressione a destra restituisce una raccolta vuota. Di seguito viene riportato un esempio di OUTER APPLY.

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

Nota

A differenza di Transact-SQL, in Entity SQL non è necessario un passaggio UNNEST esplicito.

Nota

Gli operatori CROSS e OUTER APPLY sono stati introdotti in SQL Server 2005. In alcuni casi, è possibile che la pipeline della query produca istruzioni Transact-SQL contenenti gli operatori CROSS APPLY e/o OUTER APPLY. Poiché questi operatori non sono supportati da alcuni provider di back-end, incluse le versioni di SQL Server precedenti a SQL Server 2005, non è consentita l'esecuzione di query con tali provider.

Di seguito sono elencati alcuni degli scenari tipici che potrebbero determinare la presenza degli operatori CROSS APPLY e/o OUTER APPLY nella query di output: una subquery correlata con paging, AnyElement su una subquery correlata o su una raccolta prodotta dalla navigazione, query LINQ che usano metodi di raggruppamento che accettano un selettore elemento, una query nella quale viene specificata in modo esplicito una clausola CROSS APPLY o OUTER APPLY, una query che presenta un costrutto DEREF su un costrutto REF.

Più raccolte nella clausola FROM

La clausola FROM può contenere più raccolte separate da virgole. In questi casi, si presuppone che le raccolte siano unite in join, come se si trattasse di un CROSS JOIN a n vie.

Nell'esempio seguente, C e D sono raccolte indipendenti, ma c.Names è dipendente da C.

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

L'esempio precedente rappresenta l'equivalente logico dell'esempio seguente.

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

Correlazione sinistra

Gli elementi nella clausola FROM possono fare riferimento a elementi specificati nelle clausole precedenti. Nell'esempio seguente C e D sono raccolte indipendenti, ma c.Names è dipendente da C:

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

Si tratta dell'equivalente logico di:

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

semantica

Dal punto di vista logico, si presuppone che le raccolte nella clausola FROM facciano parte di un cross join a n vie, tranne nel caso di un cross join a una via. Gli alias nella clausola FROM vengono elaborati da sinistra verso destra e vengono aggiunti all'ambito corrente per i riferimenti futuri. Si presuppone che la clausola FROM produca un multiset di righe. Per ogni elemento della clausola FROM sarà presente un campo che rappresenterà un singolo elemento della raccolta in questione.

La clausola FROM produce logicamente un multiset di righe di tipo Row(c, d, e) in cui si presuppone che i campi c, d ed e siano del tipo di elemento C, D e c.Names.

Entity SQL introduce nell'ambito un alias per ogni elemento della clausola FROM semplice. Nel frammento di clausola FROM seguente, ad esempio, i nomi introdotti nell'ambito sono c, d ed e.

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

In Entity SQL (a differenza di Transact-SQL), la clausola FROM introduce solo gli alias nell'ambito. Tutti i riferimenti alle colonne, o proprietà, di tali raccolte devono essere qualificati con l'alias.

Pull delle chiavi da query annidate

Non sono supportati determinati tipi di query che richiedono l'estrazione delle chiavi da una query annidata. Viene ad esempio considerata valida la query seguente:

select c.Orders from Customers as c

L'esempio seguente non è invece considerato valido, in quanto la query annidata non contiene chiavi:

select {1} from {2, 3}

Vedi anche