XQuery 3合并两个节点序列并进行重复数据删除

时间:2018-11-23 15:02:00

标签: xquery exist-db

在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不能胜任工作,那么在分组/区分结果时,我还能如何简单地做些(我认为呢?)的练习?

1 个答案:

答案 0 :(得分:2)

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

  

在为给定组生成的分组后元组中,每个   非分组变量绑定到包含   所有预分组元组中该变量的串联值   分配给该组的人。

然后

  

这种行为对于SQL程序员来说可能是令人惊讶的,因为SQL减少了   等于一个非分组变量等于一个代表值。