SQL, xQuery: поиск дубликатов

Я неплохо разбираюсь в SQL и xpath, но не в xquery. Как я могу написать запрос для получения всех записей, в которых XML, содержащийся в одном поле, имеет два экземпляра одного и того же элемента, который также содержит совпадающие данные подэлемента.

Поясню на примере:

Таблица: Fred
Поля таблицы: id, time, xmlone, xmltwo.
Я хочу найти все записи в этой таблице, где xmlone имеет что-то вроде следующего:

<!--xmlstart-->
<!--...any number of elements-->
<elementone position="1">
  <subelea>2010-01-01</subelea>
  <subeleb>hg72</subeleb>
  <subelec>George</subelec>
</elementone>
<!--...any number of elements here (may not end at same level)-->
    <elementone position="2">
      <subelea>2010-01-01</subelea>
      <subeleb>hg72</subeleb>
      <subelec>John</subelec>
    </elementone>
<!--xmlend-->

Примечание. Мне нужны только совпадения, в которых совпадают subelea и subeleb. Также могут быть дубликаты elementone, но меня это не волнует, если только данные из subelea и subeleb не совпадают.


person Mark W    schedule 05.12.2012    source источник


Ответы (1)


(: Self-join on all <elementone/> :)
for $i in //elementone, $j in //elementone
where $i != $j
(: Compare `$i` and `$j` on the subelements that should be equal (or whatever) :)
and $i/subelea eq $j/subelea
and $i/subeleb eq $j/subeleb
(: Return result :)
return $i

Если вам нужно позаботиться о дубликатах (на уровне элементов неважно, есть ли на входе два элемента с одинаковым содержимым), заключите все в круглые скобки и добавьте /. (пошаговые операции заботятся о дубликатах).

(
  for $i in //elementone, $j in //elementone
  where $i != $j
  and $i/subelea eq $j/subelea
  and $i/subeleb eq $j/subeleb
  return $i
)/.
person Jens Erat    schedule 05.12.2012
comment
Спасибо! - а не могли бы вы упростить для нуба. Как я уже сказал, я неплохо разбираюсь в SQL и xpath, но не в xquery. Как я могу объединить это в полное заявление? - person Mark W; 05.12.2012
comment
Это полный оператор, который отлично работает в BaseX для данных, которые вы предоставили, и должен работать во всех других процессорах XQuery. Но я упустил из виду, что вы пометили свой вопрос SQL-XQuery - лучше включите эту информацию и в свой вопрос. Мне жаль, что я не могу предоставить вам информацию о том, как вызывать XQuery, но, возможно, вы сможете скопировать и вставить это из других вопросов (просто нажмите на этот тег). Предоставьте весь XML в качестве входных данных для моего запроса, и он должен работать нормально. - person Jens Erat; 05.12.2012