FROM (Entity SQL)

Especifica la colección que se usa en las instrucciones SELECT.

Sintaxis

FROM expression [ ,...n ] AS C

Argumentos

expression
Cualquier expresión de consulta válida que produce una colección que usar como origen en una instrucción SELECT.

Observaciones

Una cláusula FROM es una lista separada por comas de uno o varios elementos de la cláusula FROM. La cláusula FROM se puede utilizar para especificar uno o varios orígenes para una instrucción SELECT. La forma más sencilla de una cláusula FROM es una expresión de una única consulta que identifica una colección y un alias que se usa como origen en una instrucción SELECT, tal y como se muestra en el ejemplo siguiente:

FROM C as c

Elementos de la cláusula FROM

Cada elemento de la cláusula FROM hace referencia a una colección de origen en la consulta de Entity SQL. Entity SQL admite las siguientes clases de elementos de la cláusula FROM: elementos de la cláusula FROM simples, elementos de la cláusula JOIN FROM y elementos de la cláusula APPLY FROM. En las siguientes secciones se describe con más detalle cada uno de estos elementos de la cláusula FROM.

Elemento de la cláusula FROM simple

El elemento de la cláusula FROM más simple es una expresión única que identifica una colección y un alias. La expresión puede ser simplemente un conjunto de entidades, una subconsulta o cualquier otra expresión que sea un tipo de colección. A continuación se muestra un ejemplo:

LOB.Customers as c

La especificación del alias es opcional. Una especificación alternativa del elemento de la cláusula FROM anterior podría ser la siguiente:

LOB.Customers

Si no se especifica un alias, Entity SQL intenta generar uno según la expresión de la colección.

Elemento de la cláusula JOIN FROM

Un elemento de la cláusula JOIN FROM representa una unión entre dos elementos de la cláusula FROM. Entity SQL admite combinaciones cruzadas, combinaciones internas, combinaciones externas izquierda y derecha, y combinaciones externas completas. Todas estas combinaciones se admiten de forma similar a como se admiten en Transact-SQL. Al igual que en Transact-SQL, los dos elementos de la cláusula FROM implicados en JOIN deben ser independientes. Es decir, no pueden estar correlacionados. En estos casos se puede usar un elemento CROSS APPLY u OUTER APPLY.

Combinaciones cruzadas

Una expresión de consulta CROSS JOIN genera el producto cartesiano de las dos colecciones, tal y como se muestra en el ejemplo siguiente:

FROM C AS c CROSS JOIN D as d

Combinaciones internas

Una expresión de consulta INNER JOIN genera un producto cartesiano restringido de las dos colecciones, tal y como se muestra en el ejemplo siguiente:

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

La expresión de consulta anterior procesa una combinación de cada elemento de la colección de la izquierda emparejada con cada elemento de la colección de la derecha, donde la condición ON es verdad. Si no se especifica ninguna condición ON, una expresión INNER JOIN degenera en CROSS JOIN.

Combinación externa izquierda y combinación externa derecha

Una expresión de consulta OUTER JOIN genera el producto cartesiano restringido de las dos colecciones, tal y como se muestra en el ejemplo siguiente:

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

La expresión de consulta anterior procesa una combinación de cada elemento de la colección de la izquierda emparejada con cada elemento de la colección de la derecha, donde la condición ON es verdad. Si la condición ON es falsa, la expresión todavía procesa una única instancia del elemento de la izquierda emparejado con el elemento de la derecha, con el valor NULL.

Una expresión RIGHT OUTER JOIN se puede expresar de una manera similar.

Combinación externa completa

Una expresión de consulta FULL OUTER JOIN explícita genera un producto cartesiano restringido de las dos colecciones, tal y como se muestra en el ejemplo siguiente:

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

La expresión de consulta anterior procesa una combinación de cada elemento de la colección de la izquierda emparejada con cada elemento de la colección de la derecha, donde la condición ON es verdad. Si la condición ON es falsa, la expresión aún procesa una instancia del elemento de la izquierda emparejada con el elemento de la derecha, con el valor NULL. También procesa una instancia del elemento de la derecha emparejado con el elemento de la izquierda, con el valor NULL.

Nota:

Para conservar la compatibilidad con SQL-92, en Transact-SQL la palabra clave OUTER es opcional. Por lo tanto, LEFT JOIN, RIGHT JOIN y FULL JOIN son sinónimos de LEFT OUTER JOIN, RIGHT OUTER JOIN y FULL OUTER JOIN.

Elemento de la cláusula APPLY

Entity SQL admite dos tipos de APPLY: CROSS APPLY y OUTER APPLY.

CROSS APPLY genera un emparejamiento único de cada elemento de la colección de la izquierda con un elemento de la colección que se crea al evaluar la expresión de la derecha. Con una expresión CROSS APPLY, la expresión de la derecha es funcionalmente dependiente del elemento de la izquierda, tal y como se muestra en el ejemplo de colección asociada siguiente:

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

El comportamiento de CROSS APPLY es similar a la lista de combinaciones. Si la expresión de la derecha se evalúa como una colección vacía, CROSS APPLY no genera ningún emparejamiento para esa instancia del elemento de la izquierda.

Una expresión OUTER APPLY se parece a CROSS APPLY, excepto en que se sigue produciendo un emparejamiento incluso cuando la expresión de la derecha se evalúa como una colección vacía. El siguiente es un ejemplo de OUTER APPLY:

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

Nota:

A diferencia de Transact-SQL, no es necesario realizar un paso UNNEST explícito en Entity SQL.

Nota:

Los operadores CROSS y OUTER APPLY se incluyeron en SQL Server 2005. En algunos casos, la canalización de la consulta podría generar código de Transact-SQL que contiene los operadores CROSS APPLY y OUTER APPLY. Dado que algunos proveedores back-end, incluidas las versiones de SQL Server anteriores a SQL Server 2005, no admiten estos operadores, tales consultas no se pueden ejecutar en ellos.

Algunos escenarios típicos que podrían conducir a la presencia de los operadores CROSS APPLYOUTER APPLY en la consulta de salida son las siguientes: una subconsulta correlacionada con la paginación; AnyElement sobre una subconsulta correlacionada o sobre una colección generada mediante navegación; consultas LINQ que utilizan métodos de agrupación que aceptan un selector de elemento; una consulta en la que se especifica explícitamente CROSS APPLY u OUTER APPLY; una consulta que tiene una construcción DEREF sobre una construcción REF.

Varias colecciones en la cláusula FROM

La cláusula FROM puede contener más de una colección separada por comas. En estos casos, se supone que las colecciones están combinadas. Considérelas como una operación CROSS JOIN de n direcciones.

En el ejemplo siguiente, C y D son colecciones independientes, pero c.Names depende de C.

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

El ejemplo anterior es lógicamente equivalente al ejemplo siguiente:

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

Correlación izquierda

Los elementos de la cláusula FROM pueden hacer referencia a los elementos especificados en las cláusulas anteriores. En el ejemplo siguiente, C y D son colecciones independientes, pero c.Names depende de C:

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

Esto es lógicamente equivalente a:

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

Semántica

Lógicamente, se supone que las colecciones de la cláusula FROM forman parte de la combinación cruzada de n direcciones (excepto en el caso de una combinación cruzada unidireccional). Los alias de la cláusula FROM se procesan de izquierda a derecha y se agregan al ámbito actual como referencia. Se supone que la cláusula FROM genera un multiconjunto de filas. Habrá un campo para cada elemento de la cláusula FROM que representa un elemento único de esa colección.

La cláusula FROM genera lógicamente un multiconjunto de filas de tipo Row(c, d, e), donde los campos c, d y e se supone que son del tipo de elemento de C, D y c.Names.

Entity SQL introduce un alias para cada elemento de la cláusula FROM simple en el ámbito. Por ejemplo, en el fragmento de código de la cláusula FROM siguiente, los nombres introducidos en el ámbito son c, d y e.

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

En Entity SQL (a diferencia de Transact-SQL), la cláusula FROM solo introduce los alias en el ámbito. Cualquier referencia a las columnas (propiedades) de estas colecciones se debe certificar con el alias.

Extraer claves de las consultas anidadas

No se admiten ciertos tipos de consultas que requieren la extracción de las claves de una consulta anidada. Por ejemplo, la consulta siguiente es válida:

select c.Orders from Customers as c

Sin embargo, la consulta siguiente no es válida, porque la consulta anidada no tiene ninguna clave:

select {1} from {2, 3}

Vea también