XQuery相同功能之间的区别不同实现

时间:2014-05-06 20:09:25

标签: xquery

返回周期数:

let $bd := doc("document")
return count (  for $c in $bd//cycle
where $c[@id]
return $c
)

每个周期都有一个ID,这里不重要,但必须指定它 上面使用的计数和下面的计数使用有什么区别?

let $bd := doc("document")
let $c := $bd//cycle[@id]
return count($c)

我不知道这两个XQueries之间的区别是返回相同的结果,但是遵循相同的模式,接下来的两个查询应该有效,但第二个查询不会...这里它们是:

模块的总小时数超过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

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

1 个答案:

答案 0 :(得分:2)

前两个表达式在功能上是等效的。不同之处在于使用FLWOR与XPath来选择序列。

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

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)