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 JOIN
Daarom zijn , RIGHT JOIN
en FULL JOIN
synoniemen voor LEFT OUTER JOIN
, RIGHT OUTER JOIN
en 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 C
van.
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 n
cross-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
, D
en 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}