Partilhar via


Cláusula FROM (consulta NoSQL)

APLICA-SE A: NoSQL

A cláusula FROM (FROM <from_specification>) é opcional, a menos que a fonte seja filtrada ou projetada posteriormente na consulta. Uma consulta como SELECT * FROM products enumera em um contêiner inteiro, independentemente do nome. Você também pode usar o identificador ROOT especial para o contêiner em vez de usar o nome do contêiner.

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

  • O contêiner pode ser aliased, como SELECT p.id FROM products AS p ou simplesmente SELECT p.id FROM products p. Aqui, p é o alias para o contêiner. O contêiner não precisa necessariamente ser nomeado products ou p. AS é uma palavra-chave opcional para o alias do identificador.
  • Uma vez aliased, 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 aliased e não pode mais ser resolvido.
  • Todas as propriedades referenciadas devem ser totalmente qualificadas, para evitar quaisquer ligações ambíguas na ausência de adesão estrita ao esquema. Por exemplo, SELECT id FROM products p é sintaticamente inválido porque a propriedade id não está vinculada. Em vez disso, a consulta deve fazer referência à propriedade id usando 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 fonte de dados, com ou sem um alias. Se o alias não for especificado, ele será inferido a partir das <container_expression> regras a seguir. Se a expressão for um container_name, então container_name é usado como um alias. Se a expressão for <container_expression>, então property_name é usada como um alias. Se a expressão for um container_name, então container_name é usado como um alias.
COMO input_alias Especifica que o input_alias é um conjunto de valores retornados pela expressão de contêiner subjacente.
input_alias EM Especifica que o input_alias deve representar o conjunto de valores obtidos pela iteração sobre todos os elementos da matriz de cada matriz retornada pela expressão de contêiner subjacente. Qualquer valor retornado pela expressão de contêiner subjacente que não seja uma matriz é ignorado.
<container_expression> Especifica a expressão de contêiner a ser usada para recuperar os itens.
ROOT Especifica que o item deve ser recuperado do contêiner padrão conectado no momento.
container_name Especifica que o item deve ser recuperado do contêiner fornecido. O nome do contêiner deve corresponder ao nome do contêiner ao qual está conectado no momento.
input_alias Especifica que o item deve ser recuperado da outra fonte definida pelo alias fornecido.
<container_expression> '.' property_name Especifica que o item deve ser recuperado acessando a property_name propriedade.
<container_expression> '[' "property_name" \| array_index ']' Especifica que o item deve ser recuperado acessando a propriedade ou array_index o property_name elemento array para todos os itens recuperados pela expressão de contêiner especificada.

Observações

Todos os aliases fornecidos ou inferidos no <from_source>(s) seu(s) devem ser exclusivos. A sintaxe <container_expression> '.' property_name é a mesma que <container_expression> '[' "property_name" ']'. No entanto, a última sintaxe pode ser usada se um nome de propriedade contiver um caractere não identificador.

Manipulando propriedades ausentes, elementos de matriz ausentes e valores indefinidos

Se uma expressão de contêiner acessar propriedades ou elementos de matriz e esse valor não existir, esse valor será ignorado e não processado posteriormente.

Escopo de contexto de expressão de contêiner

Uma expressão de contêiner pode ter escopo de contêiner ou de item:

  • Uma expressão tem escopo de contêiner, se a origem subjacente da expressão de contêiner for ou ROOT container_name. Essa expressão representa um conjunto de itens recuperados diretamente do contêiner e não depende do processamento de outras expressões de contêiner.

  • Uma expressão tem escopo de item, se a fonte subjacente da expressão de contêiner for input_alias introduzida anteriormente na consulta. Tal expressão representa um conjunto de itens obtidos pela avaliação da expressão de contêiner. Esta avaliação é realizada no âmbito de cada item pertencente ao conjunto associado ao contentor com aliased. O conjunto resultante é uma união de conjuntos obtida pela avaliação da expressão de contêiner para cada um dos itens no conjunto subjacente.

Exemplos

Neste primeiro exemplo, a FROM cláusula é usada para especificar o contêiner atual como uma origem, dar-lhe um nome exclusivo e, em seguida, um alias. O alias é então usado 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 próximo exemplo, a FROM cláusula também pode reduzir a origem a um subconjunto menor. Para enumerar apenas uma subárvore em cada item, a subraiz pode se tornar a fonte. Uma matriz ou subraiz de objeto pode ser usada como fonte.

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"
  }
]