Sdílet prostřednictvím


FROM (Entity SQL)

Určuje kolekci použitou v příkazech SELECT .

Syntaxe

FROM expression [ ,...n ] AS C

Argumenty

expression
Libovolný platný výraz dotazu, který poskytuje kolekci, která se použije jako zdroj v SELECT příkazu.

Poznámky

Klauzule FROM je čárkami oddělený seznam jedné nebo více FROM položek klauzule. Klauzuli FROM lze použít k určení jednoho nebo více zdrojů pro SELECT příkaz. Nejjednodušší forma FROM klauzule je jeden výraz dotazu, který identifikuje kolekci a alias použitý jako zdroj v SELECT příkazu, jak je znázorněno v následujícím příkladu:

FROM C as c

Položky klauzule FROM

Každá FROM položka klauzule odkazuje na zdrojovou kolekci v dotazu Entity SQL. Entity SQL podporuje následující třídy FROM položek klauzule: položky jednoduché FROM klauzule, JOIN FROM položky klauzule a APPLY FROM položky klauzule. Každá z těchto FROM položek klauzule je podrobněji popsána v následujících částech.

Položka jednoduché klauzule FROM

Nejjednodušší FROM položka klauzule je jeden výraz, který identifikuje kolekci a alias. Výraz může být jednoduše sada entit, poddotaz nebo jakýkoli jiný výraz, který je typem kolekce. Následuje příklad:

LOB.Customers as c

Specifikace aliasu je volitelná. Alternativní specifikace výše uvedené položky klauzule může být následující:

LOB.Customers

Pokud není zadán žádný alias, entity SQL se pokusí vygenerovat alias na základě výrazu kolekce.

Položka klauzule JOIN FROM

Položka JOIN FROM klauzule představuje spojení mezi dvěma FROM položkami klauzule. Entity SQL podporuje křížová spojení, vnitřní spojení, levá a pravá vnější spojení a úplná vnější spojení. Všechna tato spojení se podporují podobně jako v jazyce Transact-SQL. Stejně jako v jazyce Transact-SQL musí být obě FROM položky klauzule zahrnuté do souboru JOIN nezávislé. To znamená, že je nelze korelovat. Pro CROSS APPLY tyto případy je možné použít nebo OUTER APPLY je možné je použít.

Křížové spojení

CROSS JOIN Výraz dotazu vytvoří kartézský součin dvou kolekcí, jak je znázorněno v následujícím příkladu:

FROM C AS c CROSS JOIN D as d

Vnitřní spojení

Vytvoří INNER JOIN omezený kartézský součin dvou kolekcí, jak je znázorněno v následujícím příkladu:

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

Předchozí výraz dotazu zpracovává kombinaci každého prvku kolekce na levé straně spárované s každým prvkem kolekce vpravo, kde ON podmínka je pravdivá. Pokud není zadána žádná ON podmínka, degeneruje INNER JOIN se na CROSS JOIN.

Levé vnější spojení a pravé vnější spojení

Výraz OUTER JOIN dotazu vytvoří omezený kartézský součin dvou kolekcí, jak je znázorněno v následujícím příkladu:

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

Předchozí výraz dotazu zpracovává kombinaci každého prvku kolekce na levé straně spárované s každým prvkem kolekce vpravo, kde ON podmínka je pravdivá. ON Pokud je podmínka false, výraz stále zpracovává jednu instanci elementu na levé straně spárovaný s elementem vpravo s hodnotou null.

A RIGHT OUTER JOIN může být vyjádřeno podobným způsobem.

Úplná vnější spojení

Explicitní FULL OUTER JOIN vytvoří omezený kartézský součin dvou kolekcí, jak je znázorněno v následujícím příkladu:

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

Předchozí výraz dotazu zpracovává kombinaci každého prvku kolekce na levé straně spárované s každým prvkem kolekce vpravo, kde ON podmínka je pravdivá. ON Pokud je podmínka false, výraz stále zpracovává jednu instanci elementu na levé straně spárovaný s elementem vpravo s hodnotou null. Zpracovává také jednu instanci elementu vpravo spárovaného s elementem vlevo s hodnotou null.

Poznámka:

Chcete-li zachovat kompatibilitu s SQL-92, je v transact-SQL klíčové slovo OUTER volitelné. Proto , LEFT JOIN, RIGHT JOINa FULL JOIN jsou synonyma pro LEFT OUTER JOIN, RIGHT OUTER JOINa FULL OUTER JOIN.

Položka klauzule APPLY

Entity SQL podporuje dva druhy APPLY: CROSS APPLY a OUTER APPLY.

A CROSS APPLY vytvoří jedinečné párování každého prvku kolekce vlevo s prvkem kolekce vytvořené vyhodnocením výrazu vpravo. CROSS APPLYVýraz na pravé straně je funkčně závislý na prvku na levé straně, jak je znázorněno v následujícím příkladu přidružené kolekce:

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

Chování CROSS APPLY se podobá seznamu spojení. Pokud se výraz vpravo vyhodnotí jako prázdná kolekce, CROSS APPLY nevygeneruje žádné párování pro danou instanci prvku vlevo.

Podobá OUTER APPLY se znaku CROSS APPLY, s výjimkou párování je stále vytvořen, i když výraz vpravo vyhodnotí prázdnou kolekci. Následuje příklad OUTER APPLY:

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

Poznámka:

Na rozdíl od jazyka Transact-SQL není nutné explicitně nezadávat krok entity SQL.

Poznámka:

CROSS a OUTER APPLY operátory byly zavedeny v SYSTÉMU SQL Server 2005. V některých případech může kanál dotazu vytvořit transact-SQL, který obsahuje CROSS APPLY a/nebo OUTER APPLY operátory. Vzhledem k tomu, že někteří poskytovatelé back-endu, včetně verzí SQL Serveru starších než SQL Server 2005, nepodporují tyto operátory, tyto dotazy nelze na těchto back-endových poskytovatelích spustit.

Některé typické scénáře, které můžou vést k přítomnosti CROSS APPLY a/nebo OUTER APPLY operátorů ve výstupním dotazu, jsou následující: korelovaný poddotaz se stránkováním; AnyElement nad korelovaným poddotazem nebo kolekcí vytvořenou pomocí navigace; LINQ dotazy, které používají metody seskupení, které přijímají selektor elementu; dotaz, ve kterém CROSS APPLY jsou explicitně zadány, OUTER APPLY dotaz, který má DEREF konstruktor nad konstruktorem REF .

Více kolekcí v klauzuli FROM

Klauzule FROM může obsahovat více než jednu kolekci oddělenou čárkami. V těchto případech se předpokládá, že se kolekce spojí dohromady. Představte si je jako n-way CROSS JOIN.

V následujícím příkladu C a D jsou nezávislé kolekce, ale c.Names jsou závislé na C.

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

Předchozí příklad je logicky ekvivalentní následujícímu příkladu:

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

Levá korelace

Položky v FROM klauzuli mohou odkazovat na položky uvedené v dřívějších klauzulích. V následujícím příkladu C a D jsou nezávislé kolekce, ale c.Names jsou závislé na C:

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

To je logicky ekvivalentní:

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

Sémantika

Logicky se předpokládá, že kolekce v FROM klauzuli jsou součástí n-way křížového spojení (s výjimkou 1cestného křížového spojení). Aliasy v FROM klauzuli se zpracovávají zleva doprava a přidají se do aktuálního oboru pro pozdější referenci. Klauzule FROM se předpokládá, že vytvoří více sad řádků. Pro každou položku v FROM klauzuli bude jedno pole, které představuje jeden prvek z této položky kolekce.

Klauzule FROM logicky vytvoří více sad řádků typu Row(c, d, e), kde pole c, d a e mají být typu prvku C, Da c.Names.

Entity SQL zavádí alias pro každou položku jednoduché FROM klauzule v oboru. Například v následujícím fragmentu klauzule FROM jsou názvy zavedené do oboru c, d a e.

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

V Entity SQL (na rozdíl od jazyka Transact-SQL) FROM klauzule zavádí pouze aliasy do oboru. Všechny odkazy na sloupce (vlastnosti) těchto kolekcí musí být kvalifikované pomocí aliasu.

Vyžádání klíčů z vnořených dotazů

Některé typy dotazů, které vyžadují vyžádání klíčů z vnořeného dotazu, se nepodporují. Například následující dotaz je platný:

select c.Orders from Customers as c

Následující dotaz však není platný, protože vnořený dotaz nemá žádné klíče:

select {1} from {2, 3}

Viz také