在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
不能胜任工作,那么在分组/区分结果时,我还能如何简单地做些(我认为呢?)的练习?
答案 0 :(得分:2)
使用XQuery和group by
,$y
子句中的变量return
绑定到您创建的整个组,以便消除重复,您需要使用return $y[1]
。参见https://www.w3.org/TR/xquery-31/#id-group-by,其中说
在为给定组生成的分组后元组中,每个 非分组变量绑定到包含 所有预分组元组中该变量的串联值 分配给该组的人。
然后
这种行为对于SQL程序员来说可能是令人惊讶的,因为SQL减少了 等于一个非分组变量等于一个代表值。