我有这个文档 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>
艺术家在电影(电影)中表演,艺术家在Artiste
中有一个“a_id”字段,与Film
中的ro_a_id相同
我想选择至少出演过 2 部电影 (film
) 的每位艺术家的姓名 (a_prenom, a_nom
)
这就是我所做的:
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
行产生错误)
最佳答案
您已经非常接近了,但您的查询有几个问题:
return
子句引用了 undefined variable$x
。这应该更改为$artiste
- 修复此问题后,您可以通过构建序列(将项目括在括号中)来返回每个 Actor 的两个姓名元素:
($artiste/a_nom, $artiste/a_prenom)
。或者,您可以返回单个项目,例如,通过使用concat($artiste/a_nom, "", $artiste/a_prenom) 连接两个名称部分创建的字符串
。 - 您的
where
子句应引用$film
变量 - 具体来说,$film/f_role/@ro_a_id
。 - 此处的示例数据不包含出现在列出的两部电影以上的任何艺术家。因此
where
子句即使是固定的,也会导致 0 次点击。
我已将修改后的查询发布到 http://xqueryfiddle.liberty-development.net/nbUY4kp/1显示这些建议的更改。您会看到我注释掉了 where
子句,以便我们得到一些结果。
关于sql - 请求其他表中至少有 2 条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52660514/