Compartir a través de


Cláusula FROM (consulta NoSQL)

SE APLICA A: NoSQL

La cláusula FROM (FROM <from_specification>) es opcional, a menos que el origen se filtre o se proyecte posteriormente en la consulta. Una consulta como SELECT * FROM products enumera sobre un contenedor completo, independientemente del nombre. También puede usar el identificador especial ROOT para el contenedor en lugar de usar el nombre del contenedor.

La cláusula FROM exige las reglas siguientes por consulta:

  • Se puede establecer un alias para el contenedor, como SELECT p.id FROM products AS p o simplemente SELECT p.id FROM products p. Aquí p es el alias del contenedor. El contenedor no tiene que denominarse products ni p necesariamente. AS es una palabra clave opcional para establecer un alias para el identificador.
  • Una vez establecido un alias, el nombre de origen original no puede enlazarse. Por ejemplo, SELECT products.id FROM products p no es válido sintácticamente porque no puede establecerse el alias del identificador products y ya no puede resolverse.
  • Todas las propiedades a las que se hace referencia deben ser completas para evitar todo enlace ambiguo si no se aplica un cumplimiento estricto del esquema. Por ejemplo, SELECT id FROM products p no es válido sintácticamente porque la propiedad id no está enlazada. En su lugar, la consulta debe hacer referencia a la propiedad id mediante p.id (o <alias>.<property-name>).

Sintaxis

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

Descripción
<from_source> Especifica un origen de datos, con o sin alias. Si no se especifica, se deduce de <container_expression> con las siguientes reglas. Si la expresión es un container_name, entonces container_name se usa como un alias. Si la expresión es <container_expression>, entonces property_name se usa como un alias. Si la expresión es un container_name, entonces container_name se usa como un alias.
AS input_alias Especifica que input_alias es un conjunto de valores que la expresión del contenedor subyacente ha devuelto.
input_alias IN Especifica que input_alias debe representar el conjunto de valores obtenidos al recorrer en iteración todos los elementos de las matrices que devuelve la expresión del contenedor subyacente. Se omite cualquier valor devuelto por la expresión de contenedor subyacente que no sea una matriz.
<container_expression> Especifica la expresión de contenedor que se usará para recuperar los elementos.
ROOT Especifica que debe recuperarse el elemento predeterminado del contenedor actualmente conectado.
container_name Especifica que debe recuperarse el elemento del contenedor proporcionado. El nombre del contenedor debe coincidir con el nombre del contenedor conectado actualmente.
input_alias Especifica que debe recuperarse el elemento desde otro origen definido por el alias proporcionado.
<container_expression> '.' property_name Especifica que se debe acceder a la propiedad property_name para recuperar el documento.
<container_expression> '[' "property_name" \| array_index ']' Especifica que debe recuperarse el elemento mediante el acceso a la propiedad property_name o al elemento de matriz array_index de todos los elementos recuperados mediante la expresión de contenedor especificada.

Observaciones

Todos los alias proporcionados o deducidos en <from_source> deben ser únicos. La sintaxis <container_expression> '.' property_name es la misma que <container_expression> '[' "property_name" ']'. Sin embargo, esta última sintaxis puede usarse si un nombre de propiedad contiene algún carácter que no sea un identificador.

Control de propiedades que faltan, elementos de matriz que faltan y valores sin definir

Si una expresión de contenedor accede a propiedades o elementos de matriz y el valor no existe, ese valor se omitirá y no se sigue procesando.

Ámbito de contexto de la expresión del contenedor

Una expresión de contenedor puede ser de ámbito de contenedor o ámbito de elemento:

  • Una expresión es de ámbito de contenedor si el origen subyacente de la expresión de contenedor es ROOT o container_name. Este tipo de expresión representa un conjunto de elementos que se recuperan directamente del contenedor y no dependen del procesamiento de otras expresiones de contenedor.

  • Una expresión es de ámbito de elemento si el origen subyacente de la expresión de contenedor es el valor input_alias introducido anteriormente en la consulta. Esta expresión representa un conjunto de elementos obtenidos mediante la evaluación de la expresión contenedora. Esta evaluación se realiza en el ámbito de cada elemento que pertenece al conjunto asociado al contenedor con alias. El conjunto de resultados es una combinación de los conjuntos obtenidos al evaluar la expresión de contenedor para cada uno de los elementos del conjunto subyacente.

Ejemplos

En este primer ejemplo, la cláusula FROM se usa para especificar el contenedor actual como origen, asignarle un nombre único y, a continuación, aplicarle un alias. A continuación, el alias se usa para proyectar campos específicos en los resultados de la 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"
    }
  }
]

En este ejemplo siguiente, la cláusula FROM también puede reducir el origen a un subconjunto más pequeño. Para enumerar únicamente un subárbol en cada elemento, la subraíz puede convertirse en el origen. Una subraíz de matriz u objeto se puede usar como origen.

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