FROM (Entitets-SQL)
Anger den samling som används i SELECT-instruktioner .
Syntax
FROM expression [ ,...n ] AS C
Argument
expression
Ett giltigt frågeuttryck som ger en samling som ska användas som källa i en SELECT
-instruktion.
Kommentarer
En FROM
sats är en kommaavgränsad lista över ett eller flera FROM
satsobjekt. Satsen FROM
kan användas för att ange en eller flera källor för en SELECT
-instruktion. Den enklaste formen av en FROM
sats är ett enda frågeuttryck som identifierar en samling och ett alias som används som källa i en SELECT
-instruktion, enligt följande exempel:
FROM C as c
FROM-satsobjekt
Varje FROM
satsobjekt refererar till en källsamling i entitets-SQL-frågan. Entitets-SQL stöder följande klasser av satsobjekt FROM
: enkla FROM
satsobjekt, JOIN FROM
satsobjekt och APPLY FROM
satsobjekt. Vart och ett av dessa FROM
satsobjekt beskrivs mer detaljerat i följande avsnitt.
Enkelt FROM-satsobjekt
Det enklaste satsobjektet FROM
är ett enda uttryck som identifierar en samling och ett alias. Uttrycket kan helt enkelt vara en entitetsuppsättning, en underfråga eller något annat uttryck som är en samlingstyp. Följande utgör ett exempel:
LOB.Customers as c
Aliasspecifikationen är valfri. En alternativ specifikation av ovanstående från satsobjektet kan vara följande:
LOB.Customers
Om inget alias anges försöker Entity SQL generera ett alias baserat på samlingsuttrycket.
JOIN FROM-satsobjekt
Ett JOIN FROM
satsobjekt representerar en koppling mellan två FROM
satsobjekt. Entitets-SQL stöder korskopplingar, inre kopplingar, yttre kopplingar till vänster och höger och fullständiga yttre kopplingar. Alla dessa kopplingar stöds på samma sätt som de stöds i Transact-SQL. Precis som i Transact-SQL måste de två FROM
satsobjekten JOIN
som ingår i vara oberoende. De kan alltså inte korreleras. En CROSS APPLY
eller OUTER APPLY
kan användas för dessa fall.
Korskopplingar
Ett CROSS JOIN
frågeuttryck genererar kartesisk produkt av de två samlingarna, vilket illustreras i följande exempel:
FROM C AS c CROSS JOIN D as d
Inre kopplingar
En INNER JOIN
producerar en begränsad kartesisk produkt av de två samlingarna, vilket illustreras i följande exempel:
FROM C AS c [INNER] JOIN D AS d ON e
Föregående frågeuttryck bearbetar en kombination av varje element i samlingen till vänster parat mot varje element i samlingen till höger, där villkoret ON
är sant. Om inget ON
villkor har angetts degenereras en INNER JOIN
till en CROSS JOIN
.
Vänster yttre kopplingar och höger yttre kopplingar
Ett OUTER JOIN
frågeuttryck genererar en begränsad kartesisk produkt av de två samlingarna, enligt följande exempel:
FROM C AS c LEFT OUTER JOIN D AS d ON e
Föregående frågeuttryck bearbetar en kombination av varje element i samlingen till vänster parat mot varje element i samlingen till höger, där villkoret ON
är sant. Om villkoret ON
är falskt bearbetar uttrycket fortfarande en enda instans av elementet till vänster parkopplat mot elementet till höger, med värdet null.
A RIGHT OUTER JOIN
kan uttryckas på ett liknande sätt.
Fullständiga yttre kopplingar
En explicit FULL OUTER JOIN
skapar en begränsad kartesisk produkt av de två samlingarna enligt följande exempel:
FROM C AS c FULL OUTER JOIN D AS d ON e
Föregående frågeuttryck bearbetar en kombination av varje element i samlingen till vänster parat mot varje element i samlingen till höger, där villkoret ON
är sant. Om villkoret ON
är falskt bearbetar uttrycket fortfarande en instans av elementet till vänster parkopplat mot elementet till höger, med värdet null. Den bearbetar också en instans av elementet till höger parat mot elementet till vänster, med värdet null.
Kommentar
För att bevara kompatibiliteten med SQL-92 är nyckelordet OUTER valfritt i Transact-SQL. LEFT JOIN
Därför är , RIGHT JOIN
och FULL JOIN
synonymer för LEFT OUTER JOIN
, RIGHT OUTER JOIN
och FULL OUTER JOIN
.
APPLY-satsobjekt
Entitets-SQL stöder två typer av APPLY
: CROSS APPLY
och OUTER APPLY
.
A CROSS APPLY
ger en unik parkoppling av varje element i samlingen till vänster med ett element i samlingen som skapas genom att utvärdera uttrycket till höger. Med ett CROSS APPLY
är uttrycket till höger funktionellt beroende av elementet till vänster, vilket visas i följande associerade samlingsexempel:
SELECT c, f FROM C AS c CROSS APPLY c.Assoc AS f
Beteendet CROSS APPLY
för liknar kopplingslistan. Om uttrycket till höger utvärderas till en tom samling skapas CROSS APPLY
inga parkopplingar för den instansen av elementet till vänster.
En OUTER APPLY
liknar en CROSS APPLY
, förutom att en parkoppling fortfarande skapas även när uttrycket till höger utvärderas till en tom samling. Följande är ett exempel på en OUTER APPLY
:
SELECT c, f FROM C AS c OUTER APPLY c.Assoc AS f
Kommentar
Till skillnad från i Transact-SQL finns det inget behov av ett explicit steg som inte anges i Entitets-SQL.
Kommentar
CROSS
och OUTER APPLY
operatorer introducerades i SQL Server 2005. I vissa fall kan frågepipelinen producera Transact-SQL som innehåller CROSS APPLY
och/eller OUTER APPLY
operatorer. Eftersom vissa serverdelsproviders, inklusive versioner av SQL Server tidigare än SQL Server 2005, inte stöder dessa operatorer, kan sådana frågor inte köras på dessa serverdelsproviders.
Några typiska scenarier som kan leda till förekomsten av CROSS APPLY
och/eller OUTER APPLY
operatorer i utdatafrågan är följande: en korrelerad underfråga med växling; AnyElement över en korrelerad underfråga eller över en samling som produceras av navigering; LINQ-frågor som använder grupperingsmetoder som accepterar en elementväljare. en fråga där en CROSS APPLY
eller en OUTER APPLY
uttryckligen anges, en fråga som har en DEREF
konstruktion över en REF
konstruktion.
Flera samlingar i FROM-satsen
FROM
Satsen kan innehålla mer än en samling avgränsad med kommatecken. I dessa fall antas samlingarna vara sammanfogade. Tänk på dessa som en n-way CROSS JOIN.
I följande exempel C
och D
är oberoende samlingar, men c.Names
är beroende av C
.
FROM C AS c, D AS d, c.Names AS e
Föregående exempel är logiskt likvärdigt med följande exempel:
FROM (C AS c JOIN D AS d) CROSS APPLY c.Names AS e
Vänster korrelation
Objekt i FROM
satsen kan referera till objekt som angetts i tidigare satser. I följande exempel, C
och D
är oberoende samlingar, men c.Names
är beroende av C
:
from C as c, D as d, c.Names as e
Detta är logiskt likvärdigt med:
from (C as c join D as d) cross apply c.Names as e
Semantik
Logiskt sett antas samlingarna i FROM
satsen vara en del av en n
-way cross join (förutom vid en 1-vägs korskoppling). Alias i FROM
-satsen bearbetas från vänster till höger och läggs till i det aktuella omfånget för senare referens. Satsen FROM
antas generera en raduppsättning med flera rader. Det kommer att finnas ett fält för varje objekt i FROM
-satsen som representerar ett enda element från samlingsobjektet.
Satsen FROM
genererar logiskt flera rader av typen Row(c, d, e) där fält c, d och e antas vara av elementtypen C
, D
och c.Names
.
Entitets-SQL introducerar ett alias för varje enkelt FROM
satsobjekt i omfånget. I följande FROM-satsfragment är namnen som introduceras i omfånget c, d och e.
from (C as c join D as d) cross apply c.Names as e
I Entitets-SQL (till skillnad från Transact-SQL) FROM
introducerar satsen endast aliasen i omfånget. Alla referenser till kolumner (egenskaper) för dessa samlingar måste vara kvalificerade med aliaset.
Hämta nycklar från kapslade frågor
Vissa typer av frågor som kräver att nycklar hämtas från en kapslad fråga stöds inte. Följande fråga är till exempel giltig:
select c.Orders from Customers as c
Följande fråga är dock inte giltig eftersom den kapslade frågan inte har några nycklar:
select {1} from {2, 3}