Azure CosmosDB 中的左连接 SQL API

LEFT JOIN in Azure CosmosDB SQL API

我使用 SQL API 在 Azure Cosmos DB 集合中使用 JOIN 来查询文档。

我有两份联系文件,一份有属性地址,一份没有地址。

我需要获取所有人的地址列表(包括没有地址的人)。我使用下面的查询来做到这一点。 但是它给出了有地址的人列表。

有什么方法可以做 LEFT JOIN 吗?

查询:

SELECT base.FirstName, base.LastName, Address.City FROM ContactPerson base JOIN Address IN base.Address

示例文档:

[
  {
    "FirstName": "Saravana",
    "LastName": "Kumar",
    "Address": [
      {
        "City": "aaaa"
      },
      {
        "City": "bbbb"
      }
    ]
  },
  {
    "FirstName": "Jayanth",
    "LastName": "T"
  }
]

预期输出:

[
  {
    "FirstName": "Saravana",
    "LastName": "Kumar",
    "City": "aaa"
  },
  {
    "FirstName": "Saravana",
    "LastName": "Kumar",
    "City": "bbbb"
  },
  {
    "FirstName": "Jayanth",
    "LastName": "T"
  }
]

实际输出:

[
  {
    "FirstName": "Saravana",
    "LastName": "Kumar",
    "City": "bbbb"
  },
  {
    "FirstName": "Saravana",
    "LastName": "Kumar",
    "City": "bbbb"
  }
]

据我所知,到目前为止,cosmos db 不支持左连接,你可以投票支持这个 thread

作为解决方法,我建议您在存储过程中使用 2 个不同的 sql,然后将结果合并到其中。

1.SELECT base.FirstName, base.LastName FROM ContactPerson base where NOT IS_DEFINED(base.Address)

2.SELECT base.FirstName, base.LastName, Address.City FROM ContactPerson base JOIN Address IN base.Address

SP:

function sample() {
    var collection = getContext().getCollection();

    var array = [];
    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT base.FirstName, base.LastName, Address.City FROM ContactPerson base JOIN Address IN base.Address',
    function (err, feed, options) {
        if (err) throw err;
        if (!feed || !feed.length) {
            var response = getContext().getResponse();
            response.setBody('no docs found');
        }
        else {
                array.push(feed);
        }
    });

    var isAccepted1 = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT base.FirstName, base.LastName FROM ContactPerson base where NOT IS_DEFINED(base.Address)',
    function (err, feed1, options) {
        console.log(222)
        if (err) throw err;
        if (!feed1|| !feed1.length) {
            var response = getContext().getResponse();
            response.setBody('no docs found');
        }
        else {

                array.push(feed1);

        }
    });
    var response = getContext().getResponse();
    response.setBody(array);

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}

您可以根据需要调整输出格式。

那就别加入了。您可以直接访问地址字段。例如:

SELECT base.FirstName, base.LastName, Address.City FROM ContactPerson base

如果没有 属性

,它只会显示 null 或空字符串

可以用EXISTS语句模拟LEFT JOIN。例如:

SELECT VALUE c 
FROM c
WHERE (
    --Like a "Left Join SomeCollection"
    (NOT IS_DEFINED(c.SomeCollection) OR c.SomeCollection = null)
    OR EXISTS (
        SELECT null 
        FROM s IN c.SomeCollection
        WHERE s.PropertyName = 'SomeValue'
    )
)
--AND/OR Some other c Node conditions