【问题标题】:DocumentDb: can multiple joins include empty setsDocumentDb:多个连接是否可以包含空集
【发布时间】:2017-01-28 04:38:38
【问题描述】:

我在 DocumentDb 中有一个“消息”集合:

{
  Subject: "Foo",
  To: [
    { "Name": "Me", "Address": "me@company.com" }
  ],
  Cc: [
    { "Name": "You", "Address": "you@company.com" }
  ]
}

{
  Subject: "Bar",
  To: [
    { "Name": "You", "Address": "you@company.com" }
  ],
  Cc: []
}

我想选择所有以“you@company.com”作为收件人或抄送地址的文档:

SELECT Message.Subject
FROM Message
  JOIN To IN Message.To
  JOIN Cc IN Message.Cc
WHERE "you@company.com" IN (To.Address, Cc.Address)

这会返回第一个文档,而不是第二个。

我相信 JOIN Cc in Message.Cc 导致第二个文档从结果中删除,因为它是空的。

有没有一种方法可以构建 SQL 查询以在结果集中包含第二个文档?

【问题讨论】:

    标签: azure-cosmosdb


    【解决方案1】:

    不,这需要两个查询(您可以使用用户定义的函数在一个查询中编写它,但这种方法可能无法有效地使用索引)。

      SELECT Message.Subject
      FROM Message
      JOIN To IN Message.To
      WHERE To.Address = "you@company.com"
    
      SELECT Message.Subject
      FROM Message
      JOIN To IN Message.Cc
      WHERE Cc.Address = "you@company.com"
    

    或者,如果你有 Name 和 Value 的值,你可以写成:

    SELECT Message.Subject
    FROM Message
    WHERE ARRAY_CONTAINS(Message.To, { "Name": "You", "Address": "you@company.com" }) 
    OR ARRAY_CONTAINS(Message.Cc, { "Name": "You", "Address": "you@company.com" })
    

    如果您希望将此添加到 DocumentDB 的查询中,请通过 https://feedback.azure.com/forums/263030-documentdb/ 支持/投票支持子查询。

    【讨论】:

    • 我赞成子查询请求。这是存储过程的合理候选者吗?
    • 谢谢。存储过程与 UDF 有相同的问题,它们将无法使用索引。我肯定会推荐两个查询 - 它更轻量级,您甚至可以并行运行它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2011-08-29
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多