XQuery相同功能与不同实现之间的差异

XQuery相同功能与不同实现之间的差异,xquery,Xquery,返回循环数: let $bd := doc("document") return count ( for $c in $bd//cycle where $c[@id] return $c ) 每个循环都有一个ID,在这里不重要,但必须指定它。 上面使用count和下面使用count有什么区别 let $bd := doc("document") let $c := $bd//cycle[@id] return count($c) 我不知道这两个XQuery之间的区别,它们返回相同的结果,但

返回循环数:

let $bd := doc("document")
return count (  for $c in $bd//cycle
where $c[@id]
return $c
)
每个循环都有一个ID,在这里不重要,但必须指定它。
上面使用count和下面使用count有什么区别

let $bd := doc("document")
let $c := $bd//cycle[@id]
return count($c)
我不知道这两个XQuery之间的区别,它们返回相同的结果,但遵循相同的模式,接下来的两个查询应该可以工作,但第二个查询不能。。。这是:

超过100的模块总小时数

*Working query*
let $bd:=doc("document")
return sum (
for $m in $bd//module[@id]
where $m/hours>100
return $m/hours
)

*Not working query*
let $bd := doc("document")
for $c in $bd//module[@id]
where $c/hours>100
return sum($c/hours)
我想知道为什么按照相同的“模式”第二个查询不起作用。
非工作查询的输出如下所示:

160 160 256 224 192 160

这不是我需要的结果,我想要所有结果的总和

前两个表达式在功能上是等效的。区别在于使用FLWOR和XPath来选择序列

在第二个示例中,您正在对序列的每个项目(
$c/hours
)而不是序列本身调用
sum()

let $bd := doc("document")
return sum(
  for $c in $bd//module[@id]
  where $c/hours>100
  return $c/hours)
您还可以使用XPath:

let $bd := doc("document")
let $c := $bd//module[@id][hours>100]
return sum($c/hours)
或者类似地,将FLWOR的结果分配给变量并求和:

let $bd := doc("document")
let $c := 
  for $m in $bd//module[@id]
  where $m/hours>100
  return $m/hours
return sum($c)

第一个查询的第二个公式很可能更有效,因为您没有使用for循环进行迭代,因此实现更容易优化和利用索引。let$bd:=doc(“文档”)let$c:=$bd//module[@id][hours>100]返回和($c/hours)有没有办法将小时数>100放在where子句中?@Alpha2k如下所示
sum(对于文档中的$h(“/document”)//模块[@id]/hours,其中($h>100)返回$h)