DocumentDB SQL - Consultas SQL compuestas
Composite Queryle permite combinar datos de consultas existentes y luego aplicar filtros, agregados, etc. antes de presentar los resultados del informe, que muestran el conjunto de datos combinados. La consulta compuesta recupera varios niveles de información relacionada sobre consultas existentes y presenta los datos combinados como un resultado de consulta único y plano.
Al usar Consulta compuesta, también tiene la opción de:
Seleccione la opción de poda de SQL para eliminar tablas y campos que no son necesarios en función de las selecciones de atributos de los usuarios.
Establezca las cláusulas ORDER BY y GROUP BY.
Establezca la cláusula WHERE como un filtro sobre el conjunto de resultados de una consulta compuesta.
Los operadores anteriores se pueden componer para formar consultas más potentes. Dado que DocumentDB admite colecciones anidadas, la composición se puede concatenar o anidar.
Consideremos los siguientes documentos para este ejemplo.
AndersenFamily El documento es el siguiente.
{
"id": "AndersenFamily",
"lastName": "Andersen",
"parents": [
{ "firstName": "Thomas", "relationship": "father" },
{ "firstName": "Mary Kay", "relationship": "mother" }
],
"children": [
{
"firstName": "Henriette Thaulow",
"gender": "female",
"grade": 5,
"pets": [ { "givenName": "Fluffy", "type": "Rabbit" } ]
}
],
"location": { "state": "WA", "county": "King", "city": "Seattle" },
"isRegistered": true
}
SmithFamily El documento es el siguiente.
{
"id": "SmithFamily",
"parents": [
{ "familyName": "Smith", "givenName": "James" },
{ "familyName": "Curtis", "givenName": "Helen" }
],
"children": [
{
"givenName": "Michelle",
"gender": "female",
"grade": 1
},
{
"givenName": "John",
"gender": "male",
"grade": 7,
"pets": [
{ "givenName": "Tweetie", "type": "Bird" }
]
}
],
"location": {
"state": "NY",
"county": "Queens",
"city": "Forest Hills"
},
"isRegistered": true
}
WakefieldFamily El documento es el siguiente.
{
"id": "WakefieldFamily",
"parents": [
{ "familyName": "Wakefield", "givenName": "Robin" },
{ "familyName": "Miller", "givenName": "Ben" }
],
"children": [
{
"familyName": "Merriam",
"givenName": "Jesse",
"gender": "female",
"grade": 6,
"pets": [
{ "givenName": "Charlie Brown", "type": "Dog" },
{ "givenName": "Tiger", "type": "Cat" },
{ "givenName": "Princess", "type": "Cat" }
]
},
{
"familyName": "Miller",
"givenName": "Lisa",
"gender": "female",
"grade": 3,
"pets": [
{ "givenName": "Jake", "type": "Snake" }
]
}
],
"location": { "state": "NY", "county": "Manhattan", "city": "NY" },
"isRegistered": false
}
Echemos un vistazo a un ejemplo de consulta concatenada.
A continuación se muestra la consulta que recuperará la identificación y la ubicación de la familia donde el primer hijo givenName es Michelle.
SELECT f.id,f.location
FROM Families f
WHERE f.children[0].givenName = "Michelle"
Cuando se ejecuta la consulta anterior, produce el siguiente resultado.
[
{
"id": "SmithFamily",
"location": {
"state": "NY",
"county": "Queens",
"city": "Forest Hills"
}
}
]
Consideremos otro ejemplo de consulta concatenada.
A continuación se muestra la consulta que devolverá todos los documentos en los que el primer alumno califique más de 3.
SELECT *
FROM Families f
WHERE ({grade: f.children[0].grade}.grade > 3)
Cuando se ejecuta la consulta anterior, produce el siguiente resultado.
[
{
"id": "WakefieldFamily",
"parents": [
{
"familyName": "Wakefield",
"givenName": "Robin"
},
{
"familyName": "Miller",
"givenName": "Ben"
}
],
"children": [
{
"familyName": "Merriam",
"givenName": "Jesse",
"gender": "female",
"grade": 6,
"pets": [
{
"givenName": "Charlie Brown",
"type": "Dog"
},
{
"givenName": "Tiger",
"type": "Cat"
},
{
"givenName": "Princess",
"type": "Cat"
}
]
},
{
"familyName": "Miller",
"givenName": "Lisa",
"gender": "female",
"grade": 3,
"pets": [
{
"givenName": "Jake",
"type": "Snake"
}
]
}
],
"location": {
"state": "NY",
"county": "Manhattan",
"city": "NY"
},
"isRegistered": false,
"_rid": "Ic8LAJFujgECAAAAAAAAAA==",
"_ts": 1450541623,
"_self": "dbs/Ic8LAA==/colls/Ic8LAJFujgE=/docs/Ic8LAJFujgECAAAAAAAAAA==/",
"_etag": "\"00000500-0000-0000-0000-567582370000\"",
"_attachments": "attachments/"
},
{
"id": "AndersenFamily",
"lastName": "Andersen",
"parents": [
{
"firstName": "Thomas",
"relationship": "father"
},
{
"firstName": "Mary Kay",
"relationship": "mother"
}
],
"children": [
{
"firstName": "Henriette Thaulow",
"gender": "female",
"grade": 5,
"pets": [
{
"givenName": "Fluffy",
"type": "Rabbit"
}
]
}
],
"location": {
"state": "WA",
"county": "King",
"city": "Seattle"
},
"isRegistered": true,
"_rid": "Ic8LAJFujgEEAAAAAAAAAA==",
"_ts": 1450541624,
"_self": "dbs/Ic8LAA==/colls/Ic8LAJFujgE=/docs/Ic8LAJFujgEEAAAAAAAAAA==/",
"_etag": "\"00000700-0000-0000-0000-567582380000\"",
"_attachments": "attachments/"
}
]
Echemos un vistazo a un example de consultas anidadas.
A continuación se muestra la consulta que iterará a todos los padres y luego devolverá el documento donde familyName es Smith.
SELECT *
FROM p IN Families.parents
WHERE p.familyName = "Smith"
Cuando se ejecuta la consulta anterior, produce el siguiente resultado.
[
{
"familyName": "Smith",
"givenName": "James"
}
]
Consideremos another example de consulta anidada.
A continuación se muestra la consulta que devolverá todos los familyName.
SELECT VALUE p.familyName
FROM Families f
JOIN p IN f.parents
Cuando se ejecuta la consulta anterior, produce la siguiente salida.
[
"Wakefield",
"Miller",
"Smith",
"Curtis"
]