Partilhar via


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 JOINarquivo .

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 njunçã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, De 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}

Consulte também