FROM (Entity SQL)
Określa kolekcję używaną w instrukcjach SELECT .
Składnia
FROM expression [ ,...n ] AS C
Argumenty
expression
Każde prawidłowe wyrażenie zapytania, które daje kolekcję do użycia jako źródło w instrukcji SELECT
.
Uwagi
Klauzula FROM
to rozdzielona przecinkami lista co najmniej jednego FROM
elementu klauzuli. Klauzulę FROM
można użyć do określenia co najmniej jednego źródła dla instrukcji SELECT
. Najprostszą formą FROM
klauzuli jest pojedyncze wyrażenie zapytania, które identyfikuje kolekcję i alias używany jako źródło w instrukcji, jak pokazano w SELECT
poniższym przykładzie:
FROM C as c
FROM, elementy klauzuli
Każdy FROM
element klauzuli odwołuje się do kolekcji źródłowej w zapytaniu Entity SQL. Język Entity SQL obsługuje następujące klasy FROM
elementów klauzuli: proste FROM
elementy klauzuli, JOIN FROM
elementy klauzuli i APPLY FROM
elementy klauzuli. Każdy z tych FROM
elementów klauzuli jest bardziej szczegółowo opisany w poniższych sekcjach.
Prosty element klauzuli FROM
Najprostszym FROM
elementem klauzuli jest pojedyncze wyrażenie, które identyfikuje kolekcję i alias. Wyrażenie może być po prostu zestawem jednostek lub podzapytaniem albo dowolnym innym wyrażeniem, które jest typem kolekcji. Poniżej przedstawiono przykład:
LOB.Customers as c
Specyfikacja aliasu jest opcjonalna. Alternatywna specyfikacja powyższego elementu klauzuli może być następująca:
LOB.Customers
Jeśli nie określono aliasu, jednostka SQL próbuje wygenerować alias na podstawie wyrażenia kolekcji.
JOIN FROM, element klauzuli
Element JOIN FROM
klauzuli reprezentuje sprzężenia między dwoma FROM
elementami klauzuli. Jednostka SQL obsługuje sprzężenia krzyżowe, sprzężenia wewnętrzne, sprzężenia zewnętrzne w lewo i w prawo oraz pełne sprzężenia zewnętrzne. Wszystkie te sprzężenia są obsługiwane podobnie jak w przypadku języka Transact-SQL. Podobnie jak w języku Transact-SQL, dwa FROM
elementy klauzuli zaangażowane w JOIN
element muszą być niezależne. Oznacza to, że nie można ich skorelować. W CROSS APPLY
takich przypadkach można użyć elementu lub OUTER APPLY
.
Sprzężenia krzyżowe
Wyrażenie CROSS JOIN
zapytania generuje produkt kartezjański dwóch kolekcji, jak pokazano w poniższym przykładzie:
FROM C AS c CROSS JOIN D as d
Sprzężenia wewnętrzne
Element INNER JOIN
tworzy ograniczony produkt kartezjański dwóch kolekcji, jak pokazano w poniższym przykładzie:
FROM C AS c [INNER] JOIN D AS d ON e
Poprzednie wyrażenie zapytania przetwarza kombinację każdego elementu kolekcji po lewej stronie sparowanej z każdym elementem kolekcji po prawej stronie, gdzie ON
warunek jest spełniony. Jeśli nie ON
określono warunku, INNER JOIN
degenerates do .CROSS JOIN
Lewe sprzężenia zewnętrzne i prawe sprzężenia zewnętrzne
Wyrażenie OUTER JOIN
zapytania tworzy ograniczony produkt kartezjański dwóch kolekcji, jak pokazano w poniższym przykładzie:
FROM C AS c LEFT OUTER JOIN D AS d ON e
Poprzednie wyrażenie zapytania przetwarza kombinację każdego elementu kolekcji po lewej stronie sparowanej z każdym elementem kolekcji po prawej stronie, gdzie ON
warunek jest spełniony. ON
Jeśli warunek ma wartość false, wyrażenie nadal przetwarza pojedyncze wystąpienie elementu po lewej stronie sparowane z elementem po prawej stronie z wartością null.
Element może RIGHT OUTER JOIN
być wyrażony w podobny sposób.
Pełne sprzężenia zewnętrzne
FULL OUTER JOIN
Jawnie tworzy ograniczony produkt kartezjański dwóch kolekcji, jak pokazano w poniższym przykładzie:
FROM C AS c FULL OUTER JOIN D AS d ON e
Poprzednie wyrażenie zapytania przetwarza kombinację każdego elementu kolekcji po lewej stronie sparowanej z każdym elementem kolekcji po prawej stronie, gdzie ON
warunek jest spełniony. ON
Jeśli warunek ma wartość false, wyrażenie nadal przetwarza jedno wystąpienie elementu po lewej stronie sparowane z elementem po prawej stronie z wartością null. Przetwarza również jedno wystąpienie elementu po prawej stronie sparowane z elementem po lewej stronie z wartością null.
Uwaga
Aby zachować zgodność z językiem SQL-92, w języku Transact-SQL słowo kluczowe OUTER jest opcjonalne. W związku z tym , LEFT JOIN
RIGHT JOIN
, i FULL JOIN
są synonimami , RIGHT OUTER JOIN
LEFT OUTER JOIN
i FULL OUTER JOIN
.
APPLY, element klauzuli
Jednostka SQL obsługuje dwa rodzaje APPLY
elementów : CROSS APPLY
i OUTER APPLY
.
Element CROSS APPLY
tworzy unikatowe parowanie każdego elementu kolekcji po lewej stronie z elementem kolekcji utworzonym przez ocenę wyrażenia po prawej stronie. W przypadku CROSS APPLY
elementu wyrażenie po prawej stronie jest funkcjonalnie zależne od elementu po lewej stronie, jak pokazano w poniższym skojarzonym przykładzie kolekcji:
SELECT c, f FROM C AS c CROSS APPLY c.Assoc AS f
Zachowanie funkcji CROSS APPLY
jest podobne do listy sprzężeń. Jeśli wyrażenie po prawej stronie zwróci pustą kolekcję, CROSS APPLY
nie tworzy parowania dla tego wystąpienia elementu po lewej stronie.
Obiekt OUTER APPLY
przypomina element CROSS APPLY
, z wyjątkiem parowania, jest nadal generowany nawet wtedy, gdy wyrażenie po prawej stronie daje w wyniku pustą kolekcję. Poniżej przedstawiono przykład elementu OUTER APPLY
:
SELECT c, f FROM C AS c OUTER APPLY c.Assoc AS f
Uwaga
W przeciwieństwie do języka Transact-SQL nie ma potrzeby jawnego niepotrzebnego kroku w języku Entity SQL.
Uwaga
CROSS
operatory i OUTER APPLY
zostały wprowadzone w programie SQL Server 2005. W niektórych przypadkach potok zapytania może wygenerować język Transact-SQL, który zawiera CROSS APPLY
operatory i/lub OUTER APPLY
. Ponieważ niektórzy dostawcy zaplecza, w tym wersje programu SQL Server wcześniejsze niż SQL Server 2005, nie obsługują tych operatorów, takie zapytania nie mogą być wykonywane dla tych dostawców zaplecza.
Niektóre typowe scenariusze, które mogą prowadzić do obecności operatorów CROSS APPLY
i/lub OUTER APPLY
w zapytaniu wyjściowym, są następujące: skorelowana podzapytywanie z stronicowaniem; Dowolny element za pośrednictwem skorelowanego podzapytania lub kolekcji utworzonej przez nawigację; Zapytania LINQ korzystające z metod grupowania, które akceptują selektor elementów; zapytanie, w którym jawnie określono element CROSS APPLY
lub , zapytanie, które ma konstrukcję DEREF
nad konstrukcją REF
OUTER APPLY
.
Wiele kolekcji w klauzuli FROM
Klauzula FROM
może zawierać więcej niż jedną kolekcję rozdzielaną przecinkami. W takich przypadkach zakłada się, że kolekcje zostaną połączone razem. Pomyśl o nich jako n-way CROSS JOIN.
W poniższym przykładzie C
i D
są niezależnymi kolekcjami, ale c.Names
zależą od C
elementu .
FROM C AS c, D AS d, c.Names AS e
Poprzedni przykład jest logicznie odpowiednikiem następującego przykładu:
FROM (C AS c JOIN D AS d) CROSS APPLY c.Names AS e
Korelacja po lewej stronie
Elementy w klauzuli FROM
mogą odwoływać się do elementów określonych we wcześniejszych klauzulach. W poniższym przykładzie C
i D
są niezależnymi kolekcjami, ale c.Names
są zależne od elementu C
:
from C as c, D as d, c.Names as e
Jest to logicznie równoważne:
from (C as c join D as d) cross apply c.Names as e
semantyka
Logicznie zakłada się, że kolekcje w FROM
klauzuli są częścią n
sprzężenia krzyżowego (z wyjątkiem przypadku sprzężenia krzyżowego 1-dwukierunkowego). Aliasy w klauzuli FROM
są przetwarzane od lewej do prawej i są dodawane do bieżącego zakresu do późniejszego odwołania. Przyjmuje się, że klauzula FROM
tworzy wiele wierszy. Dla każdego elementu w klauzuli FROM
będzie istnieć jedno pole reprezentujące pojedynczy element z tego elementu kolekcji.
Klauzula FROM
logicznie tworzy wiele wierszy typu Row(c, d, e), gdzie przyjmuje się, że pola c, d i e mają być typu C
elementu , D
i c.Names
.
Język Entity SQL wprowadza alias dla każdego prostego FROM
elementu klauzuli w zakresie. Na przykład w poniższym fragmencie klauzuli FROM nazwy wprowadzone do zakresu to c, d i e.
from (C as c join D as d) cross apply c.Names as e
W języku Entity SQL (w przeciwieństwie do języka Transact-SQL) klauzula FROM
wprowadza tylko aliasy do zakresu. Wszystkie odwołania do kolumn (właściwości) tych kolekcji muszą być kwalifikowane za pomocą aliasu.
Ściąganie kluczy z zagnieżdżonych zapytań
Niektóre typy zapytań, które wymagają ściągania kluczy z zagnieżdżonego zapytania, nie są obsługiwane. Na przykład następujące zapytanie jest prawidłowe:
select c.Orders from Customers as c
Jednak następujące zapytanie jest nieprawidłowe, ponieważ zagnieżdżone zapytanie nie ma żadnych kluczy:
select {1} from {2, 3}