XQuery 3合并两个节点序列并去重
XQuery 3 merging two node sequences and de-duplicating
在 XQuery 3.1 中(在 eXistDB 4.4 下)我有两个函数,其中 return 两组节点描述了一个人的家庭关系。两个函数的结果可以重叠。
第一个函数person:person-relationship-as-object("#Guilhem_Faure_SML-AU")
returns:
<person relation="Peire_Faure_SML-AU">
<span class="en">Sibling(s)</span>
<span class="fr">Frère(s)/sœur(s)</span>
</person>
<person relation="Arnald_Faure_SML-AU">
<span class="en">Sibling(s)</span>
<span class="fr">Frère(s)/sœur(s)</span>
</person>
<person relation="Esteve_Faure_SML-AU">
<span class="en">Sibling(s)</span>
<span class="fr">Frère(s)/sœur(s)</span>
</person>
<person relation="Martin_de_Verazilh_SML-AU">
<span class="en">Aunt(s)/Uncle(s)</span>
<span class="fr">Tante(s)/Oncle(s)</span>
</person>
<person relation="Raimund_de_Verazilh_SML-AU">
<span class="en">Aunt(s)/Uncle(s)</span>
<span class="fr">Tante(s)/Oncle(s)</span>
</person>
第二个函数person:person-relationship-as-subject("#Guilhem_Faure_SML-AU")
returns
<person relation="Arnald_Faure_SML-AU">
<span class="en">Sibling(s)</span>
<span class="fr">Frère(s)/sœur(s)</span>
</person>
<person relation="Peire_Faure_SML-AU">
<span class="en">Sibling(s)</span>
<span class="fr">Frère(s)/sœur(s)</span>
</person>
<person relation="Esteve_Faure_SML-AU">
<span class="en">Sibling(s)</span>
<span class="fr">Frère(s)/sœur(s)</span>
</person>
<person relation="Bernarda_Guilhem_Faure_SML-AU">
<span class="en">Spouse(s)</span>
<span class="fr">Époux/épouse(s)</span>
</person>
现在我想将两组节点合并为一组,并且return每个不同的节点只合并一次。
我尝试了一个粗略的类似 SQL 的结构,但失败了:
let $x := person:person-relationship-as-object("#Guilhem_Faure_SML-AU")
| person:person-relationship-as-subject("#Guilhem_Faure_SML-AU")
for $y in $x
order by $y/@relation ascending
group by $y/@relation, $y/span[@class="en"], $y/span[@class="fr"]
return $y
我想我真的不明白为什么 group by
在这里不起作用。此外,如果 group by
没有完成这项工作,我还能如何处理(我认为?)应该是 grouping/distinct 结果中的简单练习?
使用 XQuery 和 group by
,return
子句中的变量 $y
绑定到您创建的整个组,因此要消除重复项,您需要使用 return $y[1]
.见 https://www.w3.org/TR/xquery-31/#id-group-by 说
In the post-grouping tuple generated for a given group, each
non-grouping variable is bound to a sequence containing the
concatenated values of that variable in all the pre-grouping tuples
that were assigned to that group.
然后
This behavior may be surprising to SQL programmers, since SQL reduces
the equivalent of a non-grouping variable to one representative value.
在 XQuery 3.1 中(在 eXistDB 4.4 下)我有两个函数,其中 return 两组节点描述了一个人的家庭关系。两个函数的结果可以重叠。
第一个函数person:person-relationship-as-object("#Guilhem_Faure_SML-AU")
returns:
<person relation="Peire_Faure_SML-AU">
<span class="en">Sibling(s)</span>
<span class="fr">Frère(s)/sœur(s)</span>
</person>
<person relation="Arnald_Faure_SML-AU">
<span class="en">Sibling(s)</span>
<span class="fr">Frère(s)/sœur(s)</span>
</person>
<person relation="Esteve_Faure_SML-AU">
<span class="en">Sibling(s)</span>
<span class="fr">Frère(s)/sœur(s)</span>
</person>
<person relation="Martin_de_Verazilh_SML-AU">
<span class="en">Aunt(s)/Uncle(s)</span>
<span class="fr">Tante(s)/Oncle(s)</span>
</person>
<person relation="Raimund_de_Verazilh_SML-AU">
<span class="en">Aunt(s)/Uncle(s)</span>
<span class="fr">Tante(s)/Oncle(s)</span>
</person>
第二个函数person:person-relationship-as-subject("#Guilhem_Faure_SML-AU")
returns
<person relation="Arnald_Faure_SML-AU">
<span class="en">Sibling(s)</span>
<span class="fr">Frère(s)/sœur(s)</span>
</person>
<person relation="Peire_Faure_SML-AU">
<span class="en">Sibling(s)</span>
<span class="fr">Frère(s)/sœur(s)</span>
</person>
<person relation="Esteve_Faure_SML-AU">
<span class="en">Sibling(s)</span>
<span class="fr">Frère(s)/sœur(s)</span>
</person>
<person relation="Bernarda_Guilhem_Faure_SML-AU">
<span class="en">Spouse(s)</span>
<span class="fr">Époux/épouse(s)</span>
</person>
现在我想将两组节点合并为一组,并且return每个不同的节点只合并一次。
我尝试了一个粗略的类似 SQL 的结构,但失败了:
let $x := person:person-relationship-as-object("#Guilhem_Faure_SML-AU")
| person:person-relationship-as-subject("#Guilhem_Faure_SML-AU")
for $y in $x
order by $y/@relation ascending
group by $y/@relation, $y/span[@class="en"], $y/span[@class="fr"]
return $y
我想我真的不明白为什么 group by
在这里不起作用。此外,如果 group by
没有完成这项工作,我还能如何处理(我认为?)应该是 grouping/distinct 结果中的简单练习?
使用 XQuery 和 group by
,return
子句中的变量 $y
绑定到您创建的整个组,因此要消除重复项,您需要使用 return $y[1]
.见 https://www.w3.org/TR/xquery-31/#id-group-by 说
In the post-grouping tuple generated for a given group, each non-grouping variable is bound to a sequence containing the concatenated values of that variable in all the pre-grouping tuples that were assigned to that group.
然后
This behavior may be surprising to SQL programmers, since SQL reduces the equivalent of a non-grouping variable to one representative value.