Implementación de subconsultas correlacionadas

Completado

Podemos optimizar aún más las expresiones JOIN escribiendo subconsultas para filtrar el número de elementos de matriz que queremos incluir en el conjunto de productos cruzados.

Vamos a examinar de nuevo el objeto JSON de ejemplo:

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

En este ejemplo, se incluyen etiquetas que están en las clases trade-in y group. ¿Qué ocurre si queremos filtrar las etiquetas de group?

Podemos reescribir la expresión JOIN escribiendo una subconsulta para filtrar las etiquetas de grupo mediante una subconsulta:

SELECT VALUE t FROM t IN p.tags WHERE t.class = 'trade-in'

Si agregamos esta subconsulta a la consulta completa, se sumará a esto:

SELECT 
    p.id,
    p.name,
    t.name AS tag
FROM 
    products p
JOIN
    (SELECT VALUE t FROM t IN p.tags WHERE t.class = 'trade-in') AS t

Nuestra matriz de resultados JSON final sería esta, con un resultado menos en el conjunto:

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