Creación de consultas de producto cruzado
Una expresión JOIN en Azure Cosmos DB for NoSQL es diferente de una expresión JOIN en una base de datos relacional, ya que su único ámbito es un solo elemento. Una expresión JOIN crea un producto cruzado entre distintas secciones de un solo elemento.
Ahora se verá este objeto JSON de ejemplo, que tiene una propiedad name y una matriz con tres objetos, cada uno con una propiedad group propia:
{
"id": "E08E4507-9666-411B-AAC4-519C00596B0A",
"name": "Men's Bib-Shorts",
"groups": [
{
"group": "accessories"
},
{
"group": "new"
},
{
"group": "sale"
}
]
}
Si crea un producto cruzado de las propiedades name y group, creará una matriz JSON con permutaciones de posibles combinaciones de nombres y grupos, lo que facilita que las aplicaciones recorran en iteración los elementos de la matriz:
[
{
"name": "Men's Bib-Shorts",
"group": "accessories"
},
{
"name": "Men's Bib-Shorts",
"group": "new"
},
{
"name": "Men's Bib-Shorts",
"group": "sale"
}
]
Así pues, ¿cómo puede crear este tipo de producto cruzado en una consulta SQL? La palabra clave JOIN
en Azure Cosmos DB for NoSQL devuelve todas las combinaciones posibles de valores en dos conjuntos. Usemos un objeto JSON de ejemplo diferente con un grupo de etiquetas más complejo:
{
"id": "80D3630F-B661-4FD6-A296-CD03BB7A4A0C",
"categoryId": "629A8F3C-CFB0-4347-8DCC-505A4789876B",
"categoryName": "Clothing, Vests",
"sku": "VE-C304-L",
"name": "Classic Vest, L",
"description": "A worn brown classic vest that was a trade-in apparel item",
"price": 32.4,
"tags": [
{
"id": "2CE9DADE-DCAC-436C-9D69-B7C886A01B77",
"name": "apparel",
"class": "group"
},
{
"id": "CA170AAD-A5F6-42FF-B115-146FADD87298",
"name": "worn",
"class": "trade-in"
},
{
"id": "CA170AAD-A5F6-42FF-B115-146FADD87298",
"name": "no-damaged",
"class": "trade-in"
}
]
}
La consulta correspondiente para esto está estructurada como la mayoría de las consultas SELECT FROM
, pero también incluye la palabra clave JOIN
, que hace referencia a la propiedad SELECT FROM
y a los alias con la letra JOIN
. Después, se agrega t.name a la lista de campos proyectados en los resultados de la consulta:
SELECT
p.id,
p.name,
t.name AS tag
FROM
products p
JOIN
t IN p.tags
El resultado de esta consulta es una matriz JSON que incluye tres objetos para el único elemento JSON del contenedor:
[
{
"id": "80D3630F-B661-4FD6-A296-CD03BB7A4A0C",
"name": "Classic Vest, L",
"tag": "apparel"
},
{
"id": "80D3630F-B661-4FD6-A296-CD03BB7A4A0C",
"name": "Classic Vest, L",
"tag": "worn"
},
{
"id": "80D3630F-B661-4FD6-A296-CD03BB7A4A0C",
"name": "Classic Vest, L",
"tag": "no-damaged"
}
]