Udostępnij za pośrednictwem


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 JOINRIGHT JOIN, i FULL JOIN są synonimami , RIGHT OUTER JOINLEFT OUTER JOINi FULL OUTER JOIN.

APPLY, element klauzuli

Jednostka SQL obsługuje dwa rodzaje APPLYelementó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 APPLYelementu 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ą REFOUTER 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 Celementu .

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ą nsprzęż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 Celementu , Di 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}

Zobacz też