连接到聚合子查询的 Cosmos DB 语法

问题描述 投票:0回答:2

我很难理解正确的语法以及在 Cosmos DB 查询中将查询连接在一起的最有效方法。

此查询为我提供了一个记录列表,其中 sourceSystemId 在多个 id 中重复。

SELECT d.NumRecs, d.sourceSystemId
            FROM (
                    SELECT
                    count(c.id) as NumRecs,
                    t.sourceSystem,
                    t.sourceSystemId
                    FROM Company AS c
                    JOIN t in c.primaryKeys
                    WHERE t.sourceSystem = "Netsuite" 
                    GROUP BY t.sourceSystem, t.sourceSystemId
                ) d
            WHERE d.NumRecs > 1

输出示例:

我想通过上面的查询返回的 sourceSystemIds 来过滤我的主查询(如下),它会公开更多相关的详细信息。

SELECT
        c.id,
        c.name,
        t.sourceSystem,
        t.sourceSystemId
        FROM Company AS c
        JOIN t in c.primaryKeys
     WHERE t.sourceSystem="Netsuite"

输出示例:

再次澄清一下,我想在第二个查询中的 WHERE 子句中添加一个附加条件,以按第一个查询返回的 sourceSystemId 进行过滤。有人可以进一步启发我如何实现这一目标吗?

azure-cosmosdb
2个回答
0
投票

由于 NoSQL API 不允许使用一个子查询的结果作为另一个子查询的过滤器,因此我采取了一种解决方法。我将聚合查询的 SELECT 更改为以下内容:

SELECT VALUE d.sourceSystemId
        FROM (
                SELECT
                count(c.id) as NumRecs,
                t.sourceSystem,
                t.sourceSystemId
                FROM Company AS c
                JOIN t in c.primaryKeys
                WHERE t.sourceSystem = "Netsuite" 
                GROUP BY t.sourceSystem, t.sourceSystemId
            ) d
        WHERE d.NumRecs > 1

这为我提供了一个以逗号分隔的 sourceSystemIds 列表,这些列表在不同 ID 的公司实体中重复。仅返回 111 个唯一值,因此我只需将值列表作为过滤器复制/粘贴到详细查询的 WHERE 子句中(我在下面缩写了 WHERE 子句):

SELECT
    *
FROM
(SELECT
        c.id,
        c.name,
        c.type,
        t.sourceSystem,
        t.sourceSystemId
        FROM Company AS c
        JOIN t in c.primaryKeys
WHERE t.sourceSystem = "Netsuite") a

WHERE a.sourceSystemId IN (
"196283",
    "507770",
    "13491",
    "507769",
    "13588"
)

-1
投票

我想您可以使用子查询从第一个查询中获取相关的 sourceSystemId 值,然后在第二个查询中使用这些值作为过滤器。

SELECT
    c.id,
    c.name,
    t.sourceSystem,
    t.sourceSystemId
FROM Company c
JOIN t IN c.primaryKeys
WHERE t.sourceSystemId IN (
    SELECT d.sourceSystemId
    FROM (
        SELECT
            COUNT(c.id) AS NumRecs,
            t.sourceSystem,
            t.sourceSystemId
        FROM Company c
        JOIN t IN c.primaryKeys
        WHERE t.sourceSystem = "Netsuite"
        GROUP BY t.sourceSystem, t.sourceSystemId
    ) d
    WHERE d.NumRecs > 1
)

这里最里面的查询检索计数大于 1 的 sourceSystemId 值。中间查询(别名为 d)过滤结果,仅包含 NumRecs 大于 1 的结果,然后外部查询根据 sourceSystemId 值过滤主查询从中间查询获得。

© www.soinside.com 2019 - 2024. All rights reserved.