XQuery 3 объединяет две последовательности узлов и устраняет дублирование - PullRequest
0 голосов
/ 23 ноября 2018

В 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 голосов
/ 23 ноября 2018

С XQuery и group by переменная $y в вашем предложении return привязана ко всей созданной вами группе, поэтому для удаления дубликатов вам необходимо использовать return $y[1].См. https://www.w3.org/TR/xquery-31/#id-group-by, в котором говорится:

В кортеже после группировки, созданном для данной группы, каждая переменная без группировки связана с последовательностью, содержащей объединенные значения этой переменной во всехкортежи предварительной группировки, которые были назначены этой группе.

, а затем

Такое поведение может удивлять программистов SQL, поскольку SQL сокращает эквивалент отсутствия группировкипеременная к одному репрезентативному значению.

...