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 APPLY
OUTER 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}