如何在Cosmos DB中用子查询实现左连接?及指定场景替代左连接
问题2:如何不使用左连接实现同集合的等效查询?
先帮你修正下原查询里的小语法错误:你写的on C.id on A.a应该是on C.id = A.a,修正后的原查询是这样的:
SELECT A.a, A.b, C.c FROM Inventory A LEFT JOIN ( SELECT B.a as id, B.a*100 as c FROM Inventory B WHERE condition1 and condition2 ) as C ON C.id = A.a
要实现和这个左连接完全相同的效果,不需要用LEFT JOIN,直接在SELECT子句里嵌套子查询就可以搞定,分两种情况给你方案:
情况1:子查询最多返回1条匹配记录
如果你的condition1和condition2加上B.a = A.a的条件后,最多只会返回1条B文档,那么可以用TOP 1来获取匹配的c值:
SELECT A.a, A.b, -- 嵌套子查询:直接获取匹配的B文档计算后的c值,无匹配则返回undefined (SELECT TOP 1 (B.a*100) as c FROM Inventory B WHERE B.a = A.a AND condition1 AND condition2).c FROM Inventory A
这个写法的效果和原左连接完全一致:每条A文档都会被返回,有匹配的B时显示对应的c,没有则c为undefined。
情况2:子查询可能返回多条匹配记录
如果子查询可能返回多条B文档,想要保留所有匹配的c值,可以用ARRAY函数把结果打包成数组:
SELECT A.a, A.b, -- 用ARRAY收集所有匹配的c值,无匹配则返回空数组 ARRAY(SELECT VALUE (B.a*100) FROM Inventory B WHERE B.a = A.a AND condition1 AND condition2) as c_list FROM Inventory A
如果想给无匹配的情况设置默认值(比如0),可以搭配COALESCE函数:
SELECT A.a, A.b, COALESCE((SELECT TOP 1 (B.a*100) FROM Inventory B WHERE B.a = A.a AND condition1 AND condition2), 0) as c FROM Inventory A
内容的提问来源于stack exchange,提问作者doma brahmaiah
相关产品推荐
相关产品推荐

