azure Cosmos DB左连接

htzpubme  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(128)

Cosmos DB的所有文档,看起来它只支持JOIN关键字,这似乎是一种INNER JOIN
我有以下查询:

SELECT * FROM
(
    SELECT 
        DISTINCT(c.id),
        c.OtherCollection,
    FROM c
    JOIN s IN c.OtherCollection
)
AS c order by c.id

这可以正常工作,并返回填充了OtherCollection的文档的数据。但它显然不会返回任何没有填充它的文档。
连接的原因是,有时我执行以下查询(查询是根据用户输入构建的)

SELECT * FROM
(
    SELECT 
        DISTINCT(c.id),
        c.OtherCollection,
    FROM c
    JOIN s IN c.OtherCollection
    WHERE s.PropertyName = 'SomeValue'
)
AS c order by c.id

问题是,在这种情况下,我如何才能拥有一种LEFT JOIN运算符?

svgewumm

svgewumm1#

请记住,CosmosDB中的联接发生在单个项中。具体来说,联接的作用域是该项,不能跨多个项和容器进行。
在某些情况下,对象或子对象为null或不存在,则可以使用检查函数(EXISTSIS_NULL)ANDEXISTS表达式模拟LEFT JOIN
甚至,更好的做法是使用EXISTS表达式来JOIN
例如:

SELECT DISTINCT(c.id),
    c.OtherCollection
FROM c
WHERE (--Like a Left Join
    NOT IS_DEFINED(s.OtherCollection) OR s.OtherCollection = null
    OR EXISTS (
        SELECT NULL FROM S IN OtherCollection 
        WHERE s.PropertyName = 'SomeValue'
    )
)
order by c.id
qij5mzcb

qij5mzcb2#

CosmosDB**JOIN**操作仅限于单个文档的范围。什么是可能的是你可以加入父对象与子对象在同一个文件。
它与SQL连接查询完全不同,SQL连接查询支持跨两个/多个表。

相关问题