Cláusula FROM (consulta NoSQL)

APLICA-SE A: NoSQL

A cláusula FROM (FROM <from_specification>) é opcional, a menos que a origem seja filtrada ou projetada mais tarde na consulta. Uma consulta como SELECT * FROM products enumera num contentor inteiro, independentemente do nome. Também pode utilizar o identificador ROOT especial para o contentor em vez de utilizar o nome do contentor.

A FROM cláusula impõe as seguintes regras por consulta:

  • O contentor pode ser aliasado, como SELECT p.id FROM products AS p ou simplesmente SELECT p.id FROM products p. p Eis o alias do contentor. O contentor não precisa necessariamente de ser nomeado products ou p. AS é uma palavra-chave opcional para alias do identificador.
  • Depois de aliasado, o nome de origem original não pode ser vinculado. Por exemplo, SELECT products.id FROM products p é sintaticamente inválido porque o identificador products foi aliasado e já não pode ser resolvido.
  • Todas as propriedades referenciadas têm de ser completamente qualificadas, para evitar enlaces ambíguos na ausência de cumprimento rigoroso do esquema. Por exemplo, SELECT id FROM products p é sintaticamente inválida porque a propriedade id não está vinculada. Em vez disso, a consulta deve referenciar a propriedade id com p.id (ou <alias>.<property-name>).

Sintaxe

FROM <from_specification>  
  
<from_specification> ::=
        <from_source> {[ JOIN <from_source>][,...n]}  
  
<from_source> ::=
          <container_expression> [[AS] input_alias]  
        | input_alias IN <container_expression>  
  
<container_expression> ::=
        ROOT
     | container_name  
     | input_alias  
     | <container_expression> '.' property_name  
     | <container_expression> '[' "property_name" | array_index ']'

Argumentos

Description
<from_source> Especifica uma origem de dados, com ou sem um alias. Se o alias não for especificado, é inferido a <container_expression> partir das seguintes regras. Se a expressão for um container_name, container_name é utilizada como um alias. Se a expressão for <container_expression>, property_name é utilizada como um alias. Se a expressão for um container_name, container_name é utilizada como um alias.
AS input_alias Especifica que é input_alias um conjunto de valores devolvidos pela expressão de contentor subjacente.
input_alias IN Especifica que o input_alias deve representar o conjunto de valores obtidos ao iterar em todos os elementos de matriz de cada matriz devolvidos pela expressão de contentor subjacente. Qualquer valor devolvido pela expressão de contentor subjacente que não seja uma matriz é ignorado.
<container_expression> Especifica a expressão de contentor a ser utilizada para obter os itens.
ROOT Especifica que o item deve ser obtido a partir do contentor predefinido atualmente ligado.
container_name Especifica que o item deve ser obtido a partir do contentor fornecido. O nome do contentor tem de corresponder ao nome do contentor atualmente ligado.
input_alias Especifica que o item deve ser obtido a partir da outra origem definida pelo alias fornecido.
<container_expression> '.' property_name Especifica que o item deve ser obtido ao aceder à property_name propriedade .
<container_expression> '[' "property_name" \| array_index ']' Especifica que o item deve ser obtido ao aceder à property_name propriedade ou array_index elemento de matriz para todos os itens obtidos pela expressão de contentor especificada.

Observações

Todos os aliases fornecidos ou inferidos nos <from_source>(s) têm de ser exclusivos. A Sintaxe <container_expression> '.' property_name é a mesma <container_expression> '[' "property_name" ']'que . No entanto, a última sintaxe pode ser utilizada se um nome de propriedade contiver um caráter não identificador.

Processar propriedades em falta, elementos de matriz em falta e valores indefinidos

Se uma expressão de contentor aceder a propriedades ou elementos de matriz e esse valor não existir, esse valor é ignorado e não processado mais.

Âmbito do contexto da expressão de contentor

Uma expressão de contentor pode ter o âmbito do contentor ou o âmbito do item:

  • Uma expressão tem um âmbito de contentor, se a origem subjacente da expressão de contentor for ROOT ou container_name. Esta expressão representa um conjunto de itens obtidos diretamente do contentor e não depende do processamento de outras expressões de contentor.

  • Uma expressão tem um âmbito de item, se a origem subjacente da expressão de contentor for input_alias introduzida anteriormente na consulta. Esta expressão representa um conjunto de itens obtidos ao avaliar a expressão de contentor. Esta avaliação é efetuada no âmbito de cada item pertencente ao conjunto associado ao contentor aliased. O conjunto resultante é uma união de conjuntos obtidos ao avaliar a expressão de contentor para cada um dos itens no conjunto subjacente.

Exemplos

Neste primeiro exemplo, a FROM cláusula é utilizada para especificar o contentor atual como uma origem, atribuir-lhe um nome exclusivo e, em seguida, aliasá-lo. Em seguida, o alias é utilizado para projetar campos específicos nos resultados da consulta.

SELECT VALUE {
    name: e.name,
    location: e.workLocation
}
FROM
    employees e
[
  {
    "name": "Tijana Stanković",
    "location": {
      "office": "Redmond, WA"
    }
  },
  {
    "name": "Jean Nadeau",
    "location": {
      "type": "Remote"
    }
  }
]

Neste exemplo seguinte, a FROM cláusula também pode reduzir a origem a um subconjunto mais pequeno. Para enumerar apenas uma subárvore em cada item, a subroota pode tornar-se a origem. Uma subroota de matriz ou objeto pode ser utilizada como uma origem.

SELECT 
    *
FROM
    employees.employment e
[
  {
    "hireDateTime": "2023-01-01T06:30:00.000Z",
    "weeklyHours": 40,
    "team": "Retail support"
  },
  {
    "hireDateTime": "2023-01-01T09:30:00.000Z",
    "team": "Retail support"
  },
  {
    "hireDateTime": "2023-01-01T15:30:00.000Z",
    "weeklyHours": 32,
    "team": "Retail support"
  }
]