【问题标题】:Select not in subquery select Cosmos DB, syntax error选择不在子查询中选择 Cosmos DB,语法错误
【发布时间】:2020-07-23 13:46:07
【问题描述】:

我最终会弄明白,但我想把它放在那里: 这个查询:

SELECT distinct value e.siteid
FROM e IN c.events
where e.sensor = 'Air Temperature'

产生这个结果:

[ "07000619231FBD", "07000619236CDB", "09000619236C01", "09000619236BE3", "0A000619236BD7"]

此查询按预期工作:

select *
from c
where c.id not in ([ "07000619231FBD", "07000619236CDB", "09000619236C01", "09000619236BE3", "0A000619236BD7"])

但是组合,即子查询,会给出语法错误:

select *
from c
where c.id not in
 (SELECT distinct value e.siteid
  FROM e IN c.events
  where e.sensor = 'Air Temperature')

我在这里错过了什么?

【问题讨论】:

    标签: azure azure-cosmosdb azure-cosmosdb-sqlapi


    【解决方案1】:

    (您的第一个查询也给出了 400 BadREquest。我假设您抄错了,实际上在没有 IN c.events 的情况下执行了此操作,因为该查询中未定义 c。)

    问题很可能是您尝试使用跨文档连接进行查询?CosmosDB 不支持连接不同的文档。只允许自加入。单独的查询会起作用,因为您随后消除了跨文档连接部分。

    Subquery documentation 明确表示(强调我的):

    有两种主要类型的子查询:

    • Correlated:引用来自外部查询的值的子查询。对于外部查询处理的每一行,都会对子查询进行一次评估。
    • 不相关:独立于外部查询的子查询。它可以独立运行,无需依赖外部查询。

    注意:Azure Cosmos DB 仅支持相关子查询

    您的初衷(单独查询)似乎是非相关查询(跨文档连接),但您实际上已经编写了一个相关查询(自连接)。你可以做的,就像你已经做的那样,只需连续进行最初的 2 个查询。


    如果您确实希望您的子查询仅检查同一文档中的气温(自联接),那么您很可能错过了 ARRAY() 函数:

    select *
    from c
    where c.id not in
     (ARRAY(SELECT distinct value e.siteid
      FROM e IN c.events
      where e.sensor = 'Air Temperature'))
    

    【讨论】:

    • 感谢您的回答!我发布的查询都没有收到对我的错误请求,复制/粘贴在模拟器和天蓝色中,但这无关紧要。我错过了 ARRAY() 函数,所以谢谢
    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    相关资源
    最近更新 更多