我很难理解正确的语法以及在 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 进行过滤。有人可以进一步启发我如何实现这一目标吗?
由于 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"
)
我想您可以使用子查询从第一个查询中获取相关的 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 值过滤主查询从中间查询获得。