Share 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 mais adiante na consulta. Uma consulta como SELECT * FROM products enumera em um contêiner inteiro, independentemente do nome. Você também pode usar a raiz do identificador especial ROOT para o contêiner em vez de usar o nome do contêiner.

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

  • O contêiner pode ser um alias, 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 que serve como alias para o identificador.
  • Após receber um alias, o nome da fonte original não pode ser associado. Por exemplo, SELECT products.id FROM products p é sintaticamente inválido, pois o identificador products foi transformando em alias e não pode mais ser resolvido.
  • Todas as propriedades referenciadas devem ser totalmente qualificadas para evitar associações ambíguas na ausência da adesão estrita ao esquema. Por exemplo, SELECT id FROM products p é sintaticamente inválido porque a propriedade id não está associada. Em vez disso, a consulta deve referenciar a 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

Descrição
<from_source> Especifica uma fonte de dados, com ou sem um alias. Se o alias não é especificado, ele é inferido de <container_expression> usando as seguinte regras. Se a expressão é container_name, container_name é usado como alias. Se a expressão é <container_expression>, property_name é usado como alias. Se a expressão é container_name, container_name é usado como alias.
COMO input_alias Especifica que input_alias é um conjunto de valores retornados pela expressão do contêiner subjacente.
input_alias EM Especifica que input_alias deve representar o conjunto de valores obtidos pela iteração em todos os elementos de 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 será ignorado.
<container_expression> Especifica a expressão do contêiner a ser usada para recuperar os itens.
ROOT Especifica que o item deve ser recuperado do padrão, contêiner atualmente conectado.
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 atualmente conectado.
input_alias Especifica que o item deve ser recuperado de outra fonte definida pelo alias fornecido.
<container_expression> '.' property_name Especifica que o item deve ser recuperado acessando a propriedade property_name.
<container_expression> '[' "property_name" \| array_index ']' Especifica que o item deve ser recuperado acessando a propriedade property_name ou o elemento de matriz array_index para todos os itens recuperados pela expressão de contêiner especificada.

Comentários

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

Manipulação de propriedades ausentes, elementos de matriz ausentes e valores indefinidos

Se uma expressão de contêiner acessar propriedades ou elementos da matriz e o valor não existe, esse valor é ignorado e não processado.

Escopo do contexto da expressão do contêiner

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

  • Uma expressão será contida no contêiner, se a origem subjacente da expressão do contêiner for ROOT ou 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 terá escopo de itens, se a fonte subjacente da expressão de contêiner for input_alias introduzido anteriormente na consulta. Essa expressão representa um conjunto de itens obtidos avaliando a expressão de contêiner. Essa avaliação é executada no escopo de cada item pertencente ao conjunto associado ao contêiner de alias. O conjunto resultante é uma união de conjuntos obtidos pela avaliação da expressão do contêiner para cada um dos itens no conjunto subjacente.

Exemplos

Neste primeiro exemplo, a cláusula FROM é usada para especificar o contêiner atual como uma origem, dar a ele um nome exclusivo e, em seguida, criar o alias. Em seguida, o alias é 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 cláusula FROM também pode reduzir a origem para um subconjunto menor. Para enumerar somente uma subárvore de cada item, a sub-raiz pode se tornar a fonte. Uma subroot de matriz ou objeto pode ser usada 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"
  }
]