FROM (SQL de entidade)
Especifica a coleção usada nas instruções SELECT .
Sintaxe
FROM expression [ ,...n ] AS C
Argumentos
expression
Qualquer expressão de consulta válida que produza uma coleção para usar como fonte em uma SELECT
instrução.
Observações
Uma FROM
cláusula é uma lista separada por vírgulas de um ou mais FROM
itens de cláusula. A FROM
cláusula pode ser usada para especificar uma ou mais fontes para uma SELECT
declaração. A forma mais simples de uma FROM
cláusula é uma única expressão de consulta que identifica uma coleção e um alias usado como fonte em uma SELECT
instrução, conforme ilustrado no exemplo a seguir:
FROM C as c
Itens da cláusula FROM
Cada FROM
item de cláusula refere-se a uma coleção de código-fonte na consulta Entity SQL. O Entity SQL suporta as seguintes classes de itens de cláusula: itens de cláusula simplesFROM
, JOIN FROM
itens de cláusula e APPLY FROM
itens de FROM
cláusula. Cada um desses FROM
itens de cláusula é descrito com mais detalhes nas seções a seguir.
Cláusula FROM Simples Item
O item de cláusula mais FROM
simples é uma única expressão que identifica uma coleção e um alias. A expressão pode ser simplesmente um conjunto de entidades, ou uma subconsulta, ou qualquer outra expressão que seja um tipo de coleção. Veja o exemplo seguinte:
LOB.Customers as c
A especificação do alias é opcional. Uma especificação alternativa do item acima da cláusula poderia ser a seguinte:
LOB.Customers
Se nenhum alias for especificado, o Entity SQL tentará gerar um alias com base na expressão de coleção.
JOIN FROM Item da Cláusula
Um JOIN FROM
item de cláusula representa uma junção entre dois FROM
itens de cláusula. O Entity SQL suporta junções cruzadas, junções internas, junções externas esquerda e direita e junções externas completas. Todas essas junções são suportadas de forma semelhante à maneira como são suportadas no Transact-SQL. Como no Transact-SQL, os dois FROM
itens de cláusula envolvidos no JOIN
devem ser independentes. Ou seja, não podem ser correlacionados. A CROSS APPLY
ou OUTER APPLY
pode ser usado para estes casos.
Juntas cruzadas
Uma CROSS JOIN
expressão de consulta produz o produto cartesiano das duas coleções, conforme ilustrado no exemplo a seguir:
FROM C AS c CROSS JOIN D as d
Juntas internas
Um INNER JOIN
produz um produto cartesiano restrito das duas coleções, como ilustrado no exemplo a seguir:
FROM C AS c [INNER] JOIN D AS d ON e
A expressão de consulta anterior processa uma combinação de cada elemento da coleção à esquerda emparelhado com cada elemento da coleção à direita, onde a ON
condição é verdadeira. Se nenhuma ON
condição for especificada, um INNER JOIN
degenera para um CROSS JOIN
arquivo .
Juntas exteriores à esquerda e às junções exteriores à direita
Uma OUTER JOIN
expressão de consulta produz um produto cartesiano restrito das duas coleções, conforme ilustrado no exemplo a seguir:
FROM C AS c LEFT OUTER JOIN D AS d ON e
A expressão de consulta anterior processa uma combinação de cada elemento da coleção à esquerda emparelhado com cada elemento da coleção à direita, onde a ON
condição é verdadeira. Se a ON
condição for false, a expressão ainda processará uma única instância do elemento à esquerda emparelhado com o elemento à direita, com o valor null.
A RIGHT OUTER JOIN
pode ser expresso de forma semelhante.
Junções exteriores completas
Um explícito FULL OUTER JOIN
produz um produto cartesiano restrito das duas coleções, como ilustrado no exemplo a seguir:
FROM C AS c FULL OUTER JOIN D AS d ON e
A expressão de consulta anterior processa uma combinação de cada elemento da coleção à esquerda emparelhado com cada elemento da coleção à direita, onde a ON
condição é verdadeira. Se a ON
condição for false, a expressão ainda processará uma instância do elemento à esquerda emparelhado contra o elemento à direita, com o valor null. Ele também processa uma instância do elemento à direita emparelhado contra o elemento à esquerda, com o valor null.
Nota
Para preservar a compatibilidade com SQL-92, no Transact-SQL a palavra-chave OUTER é opcional. Portanto, LEFT JOIN
, RIGHT JOIN
, e FULL JOIN
são sinônimos de LEFT OUTER JOIN
, RIGHT OUTER JOIN
, e FULL OUTER JOIN
.
Item da cláusula APPLY
O Entity SQL suporta dois tipos de APPLY
: CROSS APPLY
e OUTER APPLY
.
A CROSS APPLY
produz um emparelhamento único de cada elemento da coleção à esquerda com um elemento da coleção produzido pela avaliação da expressão à direita. Com um CROSS APPLY
, a expressão à direita é funcionalmente dependente do elemento à esquerda, como ilustrado no seguinte exemplo de coleção associada:
SELECT c, f FROM C AS c CROSS APPLY c.Assoc AS f
O comportamento de é semelhante à lista de CROSS APPLY
junção. Se a expressão à direita for avaliada como uma coleção vazia, o CROSS APPLY
não produzirá emparelhamentos para essa instância do elemento à esquerda.
Um OUTER APPLY
se assemelha a um CROSS APPLY
, exceto que um emparelhamento ainda é produzido mesmo quando a expressão à direita é avaliada como uma coleção vazia. Segue-se um exemplo de um OUTER APPLY
:
SELECT c, f FROM C AS c OUTER APPLY c.Assoc AS f
Nota
Ao contrário do Transact-SQL, não há necessidade de uma etapa de unnest explícita no Entity SQL.
Nota
CROSS
e OUTER APPLY
operadores foram introduzidos no SQL Server 2005. Em alguns casos, o pipeline de consulta pode produzir Transact-SQL que contém CROSS APPLY
e/ou OUTER APPLY
operadores. Como alguns provedores de back-end, incluindo versões do SQL Server anteriores ao SQL Server 2005, não oferecem suporte a esses operadores, essas consultas não podem ser executadas nesses provedores de back-end.
Alguns cenários típicos que podem levar à presença de e/ou OUTER APPLY
operadores na consulta de CROSS APPLY
saída são os seguintes: uma subconsulta correlacionada com paginação; AnyElement sobre uma subconsulta correlacionada ou sobre uma coleção produzida pela navegação; consultas LINQ que usam métodos de agrupamento que aceitam um seletor de elementos; Uma consulta na qual A CROSS APPLY
ou um OUTER APPLY
são explicitamente especificados, uma consulta que tem uma DEREF
construção sobre uma REF
construção.
Várias coleções na cláusula FROM
A FROM
cláusula pode conter mais de uma coleção separada por vírgulas. Nestes casos, presume-se que as coleções estão reunidas. Pense n-los como um n-way CROSS JOIN.
No exemplo a seguir, C
e D
são coleções independentes, mas c.Names
depende de C
.
FROM C AS c, D AS d, c.Names AS e
O exemplo anterior é logicamente equivalente ao exemplo a seguir:
FROM (C AS c JOIN D AS d) CROSS APPLY c.Names AS e
Correlação à esquerda
Os itens da FROM
cláusula podem referir-se a itens especificados em cláusulas anteriores. No exemplo a seguir, C
e D
são coleções independentes, mas c.Names
depende de C
:
from C as c, D as d, c.Names as e
Isto é logicamente equivalente a:
from (C as c join D as d) cross apply c.Names as e
Semântica
Logicamente, as coleções na FROM
cláusula são assumidas como parte de uma n
junção cruzada de 1 via). Os aliases na cláusula são processados da esquerda para a FROM
direita e são adicionados ao escopo atual para referência posterior. Presume-se que a FROM
cláusula produza um conjunto múltiplo de linhas. Haverá um campo para cada item na FROM
cláusula que representa um único elemento desse item de coleção.
A FROM
cláusula produz logicamente um conjunto múltiplo de linhas do tipo Row(c, d, e) onde os campos c, d e e são assumidos como sendo do tipo de elemento de C
, D
e c.Names
.
O Entity SQL introduz um alias para cada item de cláusula simples FROM
no escopo. Por exemplo, no trecho de cláusula FROM a seguir, Os nomes introduzidos no escopo são c, d e e.
from (C as c join D as d) cross apply c.Names as e
No Entity SQL (ao contrário do Transact-SQL), a FROM
cláusula introduz apenas os aliases no escopo. Quaisquer referências a colunas (propriedades) dessas coleções devem ser qualificadas com o alias.
Puxando chaves de consultas aninhadas
Não há suporte para certos tipos de consultas que exigem a extração de chaves de uma consulta aninhada. Por exemplo, a seguinte consulta é válida:
select c.Orders from Customers as c
No entanto, a consulta a seguir não é válida, porque a consulta aninhada não tem nenhuma chave:
select {1} from {2, 3}