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 simplementeSELECT p.id FROM products p
. Aquíp
es el alias del contenedor. El contenedor no tiene que denominarseproducts
nip
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 identificadorproducts
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 propiedadid
no está enlazada. En su lugar, la consulta debe hacer referencia a la propiedadid
mediantep.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
ocontainer_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"
}
]