请求其他表中至少有2条记录

时间:2018-10-05 07:33:24

标签: sql xml join xquery

我有这个doc xml(简短版本):

        Actions action = new Actions(Driver);
        action.MoveToElement(firstCategoryTitle).Click().Build().Perform();
        Thread.Sleep(5000);
        firstCategoryTitle.GetCssValue("background-color").Should().Be("rgba(0, 155, 212, 1)");

艺术家在电影(电影)中播放,艺术家在<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中的字段相同

我想选择至少参加过2部电影(Film)的每位艺术家的名字和名字(a_prenom, a_nom

这就是我所做的:

film

所以我不知道如何加入和提出请求,我也不知道如何返回2个字段(我知道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 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

使查询工作最简单的方法如下:

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. 第3行中的表达式('S:/path/file.xml')应该是doc('S:/path/file.xml')
  2. @ro_a_idf_role的属性,而不是film的属性。
  3. 您必须计算film元素,@ro_a_id不在第4行的范围内。
  4. $x从未声明过,您可能是说$artiste
  5. 最后一行的最后一个问题是 FLWOR 表达式在逗号后结束,因此$artiste/a_prenom不是它的一部分。您可以通过将两个部分都用括号括起来来解决这个问题。