OrientDB中对MATCH语句结果执行求和操作的实现方法
在OrientDB中对MATCH查询结果求和的正确方式
我明白你在OrientDB里用MATCH关联查询Parlamentar、Transacao和EmpresaFornecedora数据后,想对返回的单据金额t.VlrDocumento求和却遇到了子查询失败的问题,别担心,这里有两种靠谱的实现方式:
方式一:直接在MATCH的RETURN中使用聚合函数(推荐)
这种方式最简洁,OrientDB的MATCH语句支持直接在RETURN子句里应用SUM这类聚合函数,不需要额外的子查询包裹:
MATCH {class:Parlamentar, as:p} -RealizaTransacao-> {class:Transacao, as:t} -FornecidaPor-> {class:EmpresaFornecedora, as:e}, {as:e} -RealizaTransacao-> {class:Transacao, as:t2} -FornecidaPara-> {as:p} RETURN SUM(t.VlrDocumento) AS totalValorDocumento
如果你的查询结果里可能存在重复的t记录(同一张单据被多次匹配到),可以加上DISTINCT确保每个金额只统计一次:
MATCH {class:Parlamentar, as:p} -RealizaTransacao-> {class:Transacao, as:t} -FornecidaPor-> {class:EmpresaFornecedora, as:e}, {as:e} -RealizaTransacao-> {class:Transacao, as:t2} -FornecidaPara-> {as:p} RETURN SUM(DISTINCT t.VlrDocumento) AS totalValorDocumento
方式二:使用LET子句结合SELECT聚合
如果需要先对MATCH的结果做预处理再聚合,可以用LET子句把MATCH结果暂存到变量中,再通过SELECT进行求和:
LET $matchResults = MATCH {class:Parlamentar, as:p} -RealizaTransacao-> {class:Transacao, as:t} -FornecidaPor-> {class:EmpresaFornecedora, as:e}, {as:e} -RealizaTransacao-> {class:Transacao, as:t2} -FornecidaPara-> {as:p} RETURN t.VlrDocumento AS valorDocumento SELECT SUM(valorDocumento) AS totalValorDocumento FROM $matchResults
为什么你的子查询尝试失败?
你之前尝试的select sum(t_VlrDocumento) from (MATCH ...)大概率是两个细节问题导致的:
- 子查询返回的字段名是
t.VlrDocumento,不是t_VlrDocumento,字段名的写法错误会导致聚合找不到目标字段; - OrientDB对嵌套MATCH的子查询语法要求较严格,不如上面两种方式直观且易维护。
内容的提问来源于stack exchange,提问作者Gabriel Mesquita
相关产品推荐
相关产品推荐

