首页 > 解决方案 > XQuery 3 合并两个节点序列和去重

问题描述

在 XQuery 3.1(在 eXistDB 4.4 下)我有两个函数,它们返回两组节点,描述一个人的家庭关系。这两个函数的结果可以重叠。

第一个函数person:person-relationship-as-object("#Guilhem_Faure_SML-AU")返回:

<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") 返回

<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>

现在我想将两组节点合并为一组,并且每个不同的节点只返回一次。

我尝试了一个粗略的类似 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不做这项工作,我还能如何处理(我认为?)应该是分组/不同结果的简单练习?

标签: xqueryexist-db

解决方案


使用 XQuery 和,您的子句中group by的变量绑定到您创建的整个组,以便消除您需要使用的重复项。请参阅https://www.w3.org/TR/xquery-31/#id-group-by其中说$yreturnreturn $y[1]

在为给定组生成的分组后元组中,每个非分组变量都绑定到一个序列,该序列包含分配给该组的所有分组前元组中该变量的连接值。

接着

这种行为可能会让 SQL 程序员感到惊讶,因为 SQL 将非分组变量的等价物减少为一个代表值。


推荐阅读