📜  DocumentDB SQL-联接(1)

📅  最后修改于: 2023-12-03 15:30:32.959000             🧑  作者: Mango

DocumentDB SQL-联接

在 Azure Cosmos DB 的 Azure DocumentDB API 中,SQL 查询在查询语言中支持各种 JOIN 操作。下面介绍以下表的联接。

INNER JOIN

INNER JOIN 返回两个表中都有匹配行的行。

例如,有两个文档集:customers 和 orders。每个 customers 文档具有以下属性:id 和 customerName。每个 orders 文档具有以下属性:id、customerId 和 orderAmount。

以下查询将返回一个包含两个文档的集合,其中包含每个客户及其订单总金额:

SELECT c.customerName, SUM(o.orderAmount) AS totalAmount
FROM c
JOIN o IN orders
WHERE c.id = o.customerId
GROUP BY c.customerName
LEFT JOIN

LEFT JOIN 返回左侧 (或第一个) 表中的所有行以及右侧 (或第二个) 表中的匹配行。如果没有匹配行,则在结果集中包括空值。

例如,根据上面提供的 customers 和 orders 集合,以下查询将返回客户的名称、客户的 ID 和客户的累计所有订单总额:

SELECT c.customerName, c.id AS customerId, IFNULL(SUM(o.orderAmount), 0) AS totalAmount
FROM c
LEFT JOIN o IN orders
ON c.id = o.customerId
GROUP BY c.customerName, c.id
RIGHT JOIN

RIGHT JOIN 返回右侧 (或第二个) 表中的所有行以及左侧 (或第一个) 表中的匹配行。如果没有匹配行,则在结果集中包括空值。

例如,根据上面提供的 customers 和 orders 集合,以下查询将返回订单的总金额、客户的名称和订单的 ID:

SELECT IFNULL(SUM(o.orderAmount), 0) AS totalAmount, c.customerName, o.id AS orderId
FROM c
RIGHT JOIN o IN orders
ON c.id = o.customerId
GROUP BY c.customerName, o.id
FULL JOIN

FULL JOIN 返回左侧 (或第一个) 表和右侧 (或第二个) 表中的所有行。如果没有匹配行,则在结果集中包括空值。

注意:在 Azure Cosmos DB 的 Azure DocumentDB API 中不支持 FULL JOIN。

代码实现

示例代码如下:

// INNER JOIN
var query = client.CreateDocumentQuery<Customer>(collectionUri)
    .Join(client.CreateDocumentQuery<Order>(collectionUri), 
        c => c.id, 
        o => o.customerId, 
        (c, o) => new { c.customerName, o.orderAmount })
    .ToList();

// LEFT JOIN
var query = client.CreateDocumentQuery<Customer>(collectionUri)
    .GroupJoin(client.CreateDocumentQuery<Order>(collectionUri), 
        c => c.id, 
        o => o.customerId, 
        (c, orders) => new { 
            c.customerName, 
            customerId = c.id, 
            totalAmount = orders.Any() ? orders.Sum(o => o.orderAmount) : 0 })
    .ToList();

// RIGHT JOIN
var query = client.CreateDocumentQuery<Order>(collectionUri)
    .GroupJoin(client.CreateDocumentQuery<Customer>(collectionUri),
        o => o.customerId,
        c => c.id,
        (o, customers) => new {
            totalAmount = o.orderAmount,
            customerName = customers.Any() ? customers.First().customerName : null,
            orderId = o.id
        })
    .ToList();

以上示例代码是基于 C# 语言和 Azure Cosmos DB 的 .NET SDK。在使用其他编程语言时,代码可能会有所不同。