N1QL 多重连接和求和查询产生错误的输出
N1QL Multiple join and sum query producing wrong output
我有一个包含以下三个文档的存储桶:
coffee {
id
}
cold_coffee {
coffeeId
number
}
warm_coffee {
coffeeId
number
}
我使用 Couchbase Server Community Edition 6.0.0 在 N1QL 中编写了以下查询:
SELECT META(coffee).id as coffeeId,
SUM(cold_coffee.`number`) as `ccNumber`,
SUM(warm_coffee.`number`) as `wcNumber`,
FROM coffee_bucket coffee
left JOIN coffee_bucket cold_coffee
ON META(coffee).id = cold_coffee.coffeeId
and cold_coffee.type='cold_coffee'
left JOIN coffee_bucket warm_coffee
ON META(coffee).id = warm_coffee.coffeeId
and warm_coffee.type='warm_coffee'
where coffee.type='coffee'
group by META(coffee).id;
我每杯咖啡都有多个 cold_coffee 和 warm_coffee 文档,我需要对所有 cold_coffee 和 warm_coffee 文档的数字求和。我遇到的问题是,例如,如果我有以下文件:
[
coffee {
id: 1
},
cold_coffee {
coffeeId:1
number:5
},
cold_coffee {
coffeeId:1
number:5
},
warm_coffee {
coffeeId:1
number:10
}
]
我的总数如下:
ccNumber: 10
wcNumber:20
似乎是因为连接,单个 warm_coffee 文档被计算了两次?
我发现这个 site 可能有同样的错误,但不幸的是它是 SQL。
而且我不确定如何使用 N1QL 解决这个问题,因为 JOIN 的右侧术语必须是 table / bucket,如下面 post.
所示
这是一个可能的 solution 但我不确定如何实现这是 N1QL?
有人可以帮忙吗?
JOINS 可以扩展原来的行。在第一个 Join left 期间,大多数文档被展开。您正在使用第一个文档字段作为第二个连接条件,可以生成多个文档相同的条件。这就是语义的工作原理。您需要根据需要调整加盟条件。
第二个 JOIN 从 LEFT 开始最多使用一个文档。 SUM over DISTINCT 可能不起作用,因为不同文档的相同值(warm_coffee,可能计数不足)被计算一次。如果我是对的,您正在寻找第二次加入以使用来自 LEFT 大多数咖啡的独特文档。
可能你正在寻找这样的东西
SELECT c.coffeeId,
MAX(c.ccNumber) AS `ccNumber`,
SUM(warm_coffee.`number`) AS `wcNumber`,
FROM ( SELECT META(coffee).id AS coffeeId,
SUM(cold_coffee.`number`) AS `ccNumber`
FROM coffee_bucket coffee
LEFT JOIN coffee_bucket cold_coffee
ON META(coffee).id = cold_coffee.coffeeId AND cold_coffee.type='cold_coffee'
WHERE coffee.type='coffee'
GROUP BY META(coffee).id
) AS c
LEFT JOIN coffee_bucket warm_coffee
ON c.coffeeId = warm_coffee.coffeeId AND warm_coffee.type='warm_coffee'
GROUP BY c.coffeeId;
3 级加入
SELECT d.coffeeId,
MAX(c.ccNumber) AS `ccNumber`,
MAX(c.wcNumber) AS `wcNumber`,
SUM(ch.`number`) AS `chNumber`
FROM ( SELECT c.coffeeId,
MAX(c.ccNumber) AS `ccNumber`,
SUM(warm_coffee.`number`) AS `wcNumber`,
FROM ( SELECT META(coffee).id AS coffeeId,
SUM(cold_coffee.`number`) AS `ccNumber`
FROM coffee_bucket coffee
LEFT JOIN coffee_bucket cold_coffee
ON META(coffee).id = cold_coffee.coffeeId AND cold_coffee.type='cold_coffee'
WHERE coffee.type='coffee'
GROUP BY META(coffee).id
) AS c
LEFT JOIN coffee_bucket warm_coffee
ON c.coffeeId = warm_coffee.coffeeId AND warm_coffee.type='warm_coffee'
GROUP BY c.coffeeId) AS d
LEFT JOIN coffee_bucket ch
ON d.coffeeId = ch.coffeeId AND ch.type='chaoc_coffee'
GROUP BY d.coffeeId
;
我有一个包含以下三个文档的存储桶:
coffee {
id
}
cold_coffee {
coffeeId
number
}
warm_coffee {
coffeeId
number
}
我使用 Couchbase Server Community Edition 6.0.0 在 N1QL 中编写了以下查询:
SELECT META(coffee).id as coffeeId,
SUM(cold_coffee.`number`) as `ccNumber`,
SUM(warm_coffee.`number`) as `wcNumber`,
FROM coffee_bucket coffee
left JOIN coffee_bucket cold_coffee
ON META(coffee).id = cold_coffee.coffeeId
and cold_coffee.type='cold_coffee'
left JOIN coffee_bucket warm_coffee
ON META(coffee).id = warm_coffee.coffeeId
and warm_coffee.type='warm_coffee'
where coffee.type='coffee'
group by META(coffee).id;
我每杯咖啡都有多个 cold_coffee 和 warm_coffee 文档,我需要对所有 cold_coffee 和 warm_coffee 文档的数字求和。我遇到的问题是,例如,如果我有以下文件:
[
coffee {
id: 1
},
cold_coffee {
coffeeId:1
number:5
},
cold_coffee {
coffeeId:1
number:5
},
warm_coffee {
coffeeId:1
number:10
}
]
我的总数如下:
ccNumber: 10
wcNumber:20
似乎是因为连接,单个 warm_coffee 文档被计算了两次?
我发现这个 site 可能有同样的错误,但不幸的是它是 SQL。
而且我不确定如何使用 N1QL 解决这个问题,因为 JOIN 的右侧术语必须是 table / bucket,如下面 post.
所示这是一个可能的 solution 但我不确定如何实现这是 N1QL?
有人可以帮忙吗?
JOINS 可以扩展原来的行。在第一个 Join left 期间,大多数文档被展开。您正在使用第一个文档字段作为第二个连接条件,可以生成多个文档相同的条件。这就是语义的工作原理。您需要根据需要调整加盟条件。
第二个 JOIN 从 LEFT 开始最多使用一个文档。 SUM over DISTINCT 可能不起作用,因为不同文档的相同值(warm_coffee,可能计数不足)被计算一次。如果我是对的,您正在寻找第二次加入以使用来自 LEFT 大多数咖啡的独特文档。
可能你正在寻找这样的东西
SELECT c.coffeeId,
MAX(c.ccNumber) AS `ccNumber`,
SUM(warm_coffee.`number`) AS `wcNumber`,
FROM ( SELECT META(coffee).id AS coffeeId,
SUM(cold_coffee.`number`) AS `ccNumber`
FROM coffee_bucket coffee
LEFT JOIN coffee_bucket cold_coffee
ON META(coffee).id = cold_coffee.coffeeId AND cold_coffee.type='cold_coffee'
WHERE coffee.type='coffee'
GROUP BY META(coffee).id
) AS c
LEFT JOIN coffee_bucket warm_coffee
ON c.coffeeId = warm_coffee.coffeeId AND warm_coffee.type='warm_coffee'
GROUP BY c.coffeeId;
3 级加入
SELECT d.coffeeId,
MAX(c.ccNumber) AS `ccNumber`,
MAX(c.wcNumber) AS `wcNumber`,
SUM(ch.`number`) AS `chNumber`
FROM ( SELECT c.coffeeId,
MAX(c.ccNumber) AS `ccNumber`,
SUM(warm_coffee.`number`) AS `wcNumber`,
FROM ( SELECT META(coffee).id AS coffeeId,
SUM(cold_coffee.`number`) AS `ccNumber`
FROM coffee_bucket coffee
LEFT JOIN coffee_bucket cold_coffee
ON META(coffee).id = cold_coffee.coffeeId AND cold_coffee.type='cold_coffee'
WHERE coffee.type='coffee'
GROUP BY META(coffee).id
) AS c
LEFT JOIN coffee_bucket warm_coffee
ON c.coffeeId = warm_coffee.coffeeId AND warm_coffee.type='warm_coffee'
GROUP BY c.coffeeId) AS d
LEFT JOIN coffee_bucket ch
ON d.coffeeId = ch.coffeeId AND ch.type='chaoc_coffee'
GROUP BY d.coffeeId
;