Dela via


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 JOINDärför är , RIGHT JOINoch FULL JOIN synonymer för LEFT OUTER JOIN, RIGHT OUTER JOINoch 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, Doch 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}

Se även