首页 > 解决方案 > 请求其他表中至少有 2 条记录

问题描述

我有这个文档 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行会产生错误)

标签: sqlxmljoinxquery

解决方案


您非常接近,但您的查询有几个问题:

  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子句,以便我们得到一些结果。


推荐阅读