相関サブクエリを実装する

完了

外積セットに含める配列項目の数をフィルター処理するサブクエリを作成することにより、JOIN 式をさらに最適化できます。

もう一度、JSON オブジェクトの例を調べてみることにしましょう。

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

この例では、trade-ingroup の両方のクラス内にあるタグが含まれています。 group タグを除外したい場合、どうしたらよいでしょうか?

サブクエリを使用して group タグを除外するサブクエリを記述して JOIN 式を書き直すことができます。

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

このサブクエリをすべてのクエリ全体に追加すると、次のようになります。

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

最終的な JSON 結果配列は次のようになり、セット内の結果は 1 つ少なくなります。

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