запрос, где в другой таблице есть как минимум 2 записи - PullRequest
0 голосов
/ 05 октября 2018

У меня есть этот документ XML (короткая версия):

<Artiste>
        <artiste  a_id="A62" a_p_id="UK" a_date_nais="07/06/1952" a_sexe="M">
            <a_prenom>Liam</a_prenom>
            <a_nom>Neeson</a_nom>
        </artiste>
<artiste  a_id="A66" a_p_id="UK" a_date_nais="08/09/1971" a_sexe="M">
            <a_prenom>Martin</a_prenom>
            <a_nom>Freeman</a_nom>
        </artiste>
<Film>
        <film f_id="F1" f_p_id="FR" f_r_id="A61">
            <f_genre>P</f_genre>
            <f_titre>Banlieue 13</f_titre>
            <f_date_sortie>10/11/2004</f_date_sortie>
            <f_resume>fiction française</f_resume>
            <f_role ro_nom="Leïto" ro_a_id="A63"/>
            <f_role ro_nom="Lola" ro_a_id="A64"/> 
        </film>
        <film f_id="F2" f_p_id="NZ" f_r_id="A59">
            <f_genre>A</f_genre>
            <f_titre>Les seigneurs des anneaux</f_titre>
            <f_date_sortie>19/12/2005</f_date_sortie>
            <f_resume>fiction américaine</f_resume>
            <f_role ro_nom="Pêcheur" ro_a_id="A25"/>
            <f_role ro_nom="Sirène" ro_a_id="A2"/>
        </film>
</Film>

Артист играет в фильме (фильме), у художника есть поле 'a_id' в Artiste, которое совпадает с полемro_a_id в Film

Я хочу выбрать имя и имя (a_prenom, a_nom) всех артистов, которые сыграли хотя бы в 2 фильмах (film)

Вот чтоЯ сделал:

for $artiste in doc('S:/path/file.xml')//Artiste/artiste
  (: retrieve film $artiste is working in :)
  let $film := ('S:/path/file.xml')//Film/film[@ro_a_id=$artiste/@a_id]
  where count(@ro_a_id)>=2
  order by $artiste/@a_id
  return $x/a_nom, $x/a_prenom

Так что я не знаю, как присоединиться и сделать запрос, и я также не знаю, как вернуть 2 поля (я знаю, что строка $x/a_nom, $x/a_prenom генерируетошибка)

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Самый простой способ заставить ваш запрос работать следующим образом:

for $artiste in doc('S:/path/file.xml')//Artiste/artiste
(: retrieve film $artiste is working in :)
let $film := doc('S:/path/file.xml')//Film/film[f_role/@ro_a_id=$artiste/@a_id]
where count($film)>=2
order by $artiste/@a_id
return ($artiste/a_nom, $artiste/a_prenom)

Вот что я изменил:

  1. Выражение ('S:/path/file.xml') в строке 3, вероятно, должно бытьbe doc('S:/path/file.xml').
  2. @ro_a_id является атрибутом f_role, а не film.
  3. Вы должны сосчитать film элементов, @ro_a_id не находится в области видимостив строке 4.
  4. $x никогда не объявляется, вы, вероятно, имеете в виду $artiste.
  5. Последняя проблема в последней строке заключается в том, что выражение FLWOR заканчивается послезапятая, поэтому $artiste/a_prenom не является частью этого.Вы можете решить эту проблему, заключив обе части в круглые скобки.
0 голосов
/ 05 октября 2018

Вы очень близки, но у вашего запроса есть пара проблем:

  1. Предложение return ссылается на неопределенную переменную $x.Это должно быть изменено на $artiste
  2. Как только это будет исправлено, вы можете вернуть два элемента имени каждого актера, создав последовательность - заключив элементы в скобки: ($artiste/a_nom, $artiste/a_prenom).В качестве альтернативы вы можете вернуть один элемент, например, строку, созданную путем объединения двух частей имени, с concat($artiste/a_nom, " ", $artiste/a_prenom).
  3. Ваше предложение where должно ссылаться на переменную $film, в частности, $film/f_role/@ro_a_id.
  4. Ваши примеры данных здесь не содержат артистов, которые появляются в более чем двух из перечисленных фильмов.Таким образом, предложение where, даже если оно исправлено, приведет к 0 ударам.

Я отправил исправленный запрос в http://xqueryfiddle.liberty -development.net / nbUY4kp / 1 показывая эти предлагаемые изменения.Вы увидите, что я закомментировал предложение where, чтобы мы получили некоторые результаты.

...