複数製品のクエリを作成する
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"
}
]