Delen via


FROM (Entity SQL)

Hiermee geeft u de verzameling die wordt gebruikt in SELECT-instructies .

Syntaxis

FROM expression [ ,...n ] AS C

Argumenten

expression
Elke geldige query-expressie die een verzameling oplevert die als bron in een SELECT instructie moet worden gebruikt.

Opmerkingen

Een FROM component is een door komma's gescheiden lijst met een of meer FROM componentitems. De FROM component kan worden gebruikt om een of meer bronnen voor een SELECT instructie op te geven. De eenvoudigste vorm van een FROM component is één query-expressie die een verzameling en een alias identificeert die wordt gebruikt als de bron in een SELECT instructie, zoals wordt geïllustreerd in het volgende voorbeeld:

FROM C as c

FROM-componentitems

Elk FROM componentitem verwijst naar een bronverzameling in de Entiteit SQL-query. Entity SQL ondersteunt de volgende klassen FROM componentitems: eenvoudige FROM componentitems, JOIN FROM componentitems en APPLY FROM componentitems. Elk van deze FROM componentitems wordt gedetailleerder beschreven in de volgende secties.

Eenvoudig FROM-componentitem

Het eenvoudigste FROM componentitem is één expressie die een verzameling en een alias identificeert. De expressie kan gewoon een entiteitsset of een subquery zijn, of een andere expressie die een verzamelingstype is. Hier volgt een voorbeeld:

LOB.Customers as c

De aliasspecificatie is optioneel. Een alternatieve specificatie van het bovenstaande van componentitem kan het volgende zijn:

LOB.Customers

Als er geen alias is opgegeven, probeert Entity SQL een alias te genereren op basis van de verzamelingsexpressie.

JOIN FROM-componentitem

Een JOIN FROM componentitem vertegenwoordigt een join tussen twee FROM componentitems. Entity SQL biedt ondersteuning voor cross joins, inner joins, left- en right outer joins en full outer joins. Al deze joins worden ondersteund op dezelfde manier als in Transact-SQL. Net als in Transact-SQL moeten de twee FROM componentitems die bij de JOIN component betrokken zijn onafhankelijk zijn. Dat wil gezegd, ze kunnen niet worden gecorreleerd. A CROSS APPLY of OUTER APPLY kan worden gebruikt voor deze gevallen.

Cross Joins

Een CROSS JOIN query-expressie produceert het Cartesische product van de twee verzamelingen, zoals wordt geïllustreerd in het volgende voorbeeld:

FROM C AS c CROSS JOIN D as d

Inner Joins

Een INNER JOIN produceert een beperkt Cartesisch product van de twee verzamelingen, zoals geïllustreerd in het volgende voorbeeld:

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

De vorige query-expressie verwerkt een combinatie van elk element van de verzameling aan de linkerkant, gekoppeld aan elk element van de verzameling aan de rechterkant, waarbij de ON voorwaarde waar is. Als er geen ON voorwaarde is opgegeven, wordt een INNER JOIN degenereert naar een CROSS JOIN.

Left Outer Joins en Right Outer Joins

Een OUTER JOIN query-expressie produceert een beperkt Cartesisch product van de twee verzamelingen, zoals wordt geïllustreerd in het volgende voorbeeld:

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

De vorige query-expressie verwerkt een combinatie van elk element van de verzameling aan de linkerkant, gekoppeld aan elk element van de verzameling aan de rechterkant, waarbij de ON voorwaarde waar is. Als de ON voorwaarde onwaar is, verwerkt de expressie nog steeds één exemplaar van het element aan de linkerkant dat is gekoppeld aan het element aan de rechterkant, met de waarde null.

Een RIGHT OUTER JOIN kan op een vergelijkbare manier worden uitgedrukt.

Full Outer Joins

Een expliciet FULL OUTER JOIN product produceert een beperkt Cartesisch product van de twee verzamelingen, zoals geïllustreerd in het volgende voorbeeld:

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

De vorige query-expressie verwerkt een combinatie van elk element van de verzameling aan de linkerkant, gekoppeld aan elk element van de verzameling aan de rechterkant, waarbij de ON voorwaarde waar is. Als de ON voorwaarde onwaar is, verwerkt de expressie nog steeds één exemplaar van het element aan de linkerkant dat is gekoppeld aan het element aan de rechterkant, met de waarde null. Het verwerkt ook één exemplaar van het element aan de rechterkant die is gekoppeld aan het element aan de linkerkant, met de waarde null.

Notitie

Om de compatibiliteit met SQL-92 te behouden, is het sleutelwoord OUTER optioneel in Transact-SQL. LEFT JOINDaarom zijn , RIGHT JOINen FULL JOIN synoniemen voor LEFT OUTER JOIN, RIGHT OUTER JOINen FULL OUTER JOIN.

Componentitem APPLY

Entity SQL ondersteunt twee soorten APPLY: CROSS APPLY en OUTER APPLY.

A CROSS APPLY produceert een unieke koppeling van elk element van de verzameling aan de linkerkant met een element van de verzameling dat wordt geproduceerd door de expressie aan de rechterkant te evalueren. Met een CROSS APPLY, de expressie aan de rechterkant is functioneel afhankelijk van het element aan de linkerkant, zoals geïllustreerd in het volgende gekoppelde verzamelingsvoorbeeld:

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

Het gedrag van CROSS APPLY is vergelijkbaar met de joinlijst. Als de expressie aan de rechterkant resulteert in een lege verzameling, produceert de CROSS APPLY expressie geen combinaties voor dat exemplaar van het element aan de linkerkant.

Een OUTER APPLY lijkt op een CROSS APPLY, behalve een koppeling wordt nog steeds geproduceerd, zelfs wanneer de expressie aan de rechterkant resulteert in een lege verzameling. Hier volgt een voorbeeld van:OUTER APPLY

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

Notitie

In tegenstelling tot in Transact-SQL is er geen expliciete onnestste stap in Entity SQL nodig.

Notitie

CROSS en OUTER APPLY operators zijn geïntroduceerd in SQL Server 2005. In sommige gevallen kan de querypijplijn Transact-SQL produceren die operators en/of OUTER APPLY bevatCROSS APPLY. Omdat sommige back-endproviders, waaronder versies van SQL Server ouder dan SQL Server 2005, deze operators niet ondersteunen, kunnen dergelijke query's niet worden uitgevoerd op deze back-endproviders.

Enkele typische scenario's die kunnen leiden tot de aanwezigheid van CROSS APPLY en/of OUTER APPLY operators in de uitvoerquery zijn het volgende: een gecorreleerde subquery met paging; AnyElement over een gecorreleerde subquery of over een verzameling geproduceerd door navigatie; LINQ-query's die gebruikmaken van groeperingsmethoden die een elementselector accepteren; een query waarin een CROSS APPLY of meer OUTER APPLY expliciet zijn opgegeven; een query met een DEREF constructie over een REF constructie.

Meerdere verzamelingen in de FROM-component

De FROM component kan meer dan één verzameling bevatten, gescheiden door komma's. In deze gevallen wordt ervan uitgegaan dat de verzamelingen worden samengevoegd. U kunt deze zien als een n-way CROSS JOIN.

In het volgende voorbeeld C zijn ze D onafhankelijke verzamelingen, maar c.Names zijn ze afhankelijk Cvan.

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

Het vorige voorbeeld is logisch gelijk aan het volgende voorbeeld:

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

Linkercorrelatie

Items in de FROM component kunnen verwijzen naar items die zijn opgegeven in eerdere componenten. In het volgende voorbeeld C zijn onafhankelijke D verzamelingen, maar c.Names afhankelijk van C:

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

Dit is logisch gelijk aan:

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

Semantiek

Logisch wordt ervan uitgegaan dat de verzamelingen in de FROM component deel uitmaken van een ncross-way join (behalve in het geval van een cross join in één richting). Aliassen in de FROM component worden van links naar rechts verwerkt en worden toegevoegd aan het huidige bereik voor later gebruik. De FROM component wordt verondersteld om een multiset rijen te produceren. Er is één veld voor elk item in de FROM component die één element van dat verzamelingsitem vertegenwoordigt.

De FROM component produceert logisch een multiset van rijen van het type Row(c, d, e) waarbij velden c, d en e worden verondersteld van het elementtype C, Den c.Names.

Entiteit SQL introduceert een alias voor elk afzonderlijk FROM componentitem binnen het bereik. In het volgende FROM-componentfragment zijn de namen die in het bereik zijn geïntroduceerd bijvoorbeeld c, d en e.

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

In Entity SQL (in tegenstelling tot Transact-SQL) introduceert de FROM component alleen de aliassen in het bereik. Verwijzingen naar kolommen (eigenschappen) van deze verzamelingen moeten worden gekwalificeerd met de alias.

Sleutels ophalen uit geneste query's

Bepaalde typen query's waarvoor het ophalen van sleutels uit een geneste query is vereist, worden niet ondersteund. De volgende query is bijvoorbeeld geldig:

select c.Orders from Customers as c

De volgende query is echter niet geldig, omdat de geneste query geen sleutels heeft:

select {1} from {2, 3}

Zie ook