複数製品のクエリを作成する

完了

Azure Cosmos DB for NoSQL の JOIN は、そのスコープが単一の項目のみであるため、リレーショナル データベースの JOIN とは異なります。 JOIN により、単一の項目の異なるセクション間で外積が作成されます。

次の JSON オブジェクトの例を見てみましょう。これには、name プロパティと、それぞれが専用の group プロパティを持つ 3 つのオブジェクトを含む配列が含まれています。

{
    "id": "E08E4507-9666-411B-AAC4-519C00596B0A",
    "name": "Men's Bib-Shorts",
    "groups": [
        {
            "group": "accessories"
        },
        {
            "group": "new"
        },
        {
            "group": "sale"
        }
    ]
}

およびグループプロパティのクロス積を作成すると、名前とグループの組み合わせの可能な順列を含むJSON配列を作成し、アプリケーションが配列内の項目を反復処理しやすくなります。

[
    {
        "name": "Men's Bib-Shorts",
        "group": "accessories"
    },
    {
        "name": "Men's Bib-Shorts",
        "group": "new"
    },
    {
        "name": "Men's Bib-Shorts",
        "group": "sale"
    }
]

では、SQL クエリでこの種類の外積を作成するには、どうすればよいでしょうか? Azure Cosmos DB for NoSQL の JOIN キーワードにより、2 つのセット内で可能なすべての値の組み合わせが返されます。 より複雑なタグのグループを含む 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"
        }
    ]
}

この例の対応するクエリは、ほとんどのSELECT FROMクエリと同様に構造化されていますが、JOINキーワードも含まれています。タグプロパティを参照し、文字tでエイリアス化します。 次に、クエリ結果内の投影されたフィールドの一覧に、t.name を、追加します。

SELECT 
    p.id,
    p.name,
    t.name AS tag
FROM 
    products p
JOIN
    t IN p.tags

このクエリの結果は JSON 配列であり、コンテナー内の単一の JSON 項目に対して 3 つのオブジェクトが含まれます。

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