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 JOIN
a FULL JOIN
jsou synonyma pro LEFT OUTER JOIN
, RIGHT OUTER JOIN
a 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 APPLY
Vý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
, D
a 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}