【问题标题】:request where there are at least 2 records in other table请求其他表中至少有 2 条记录
【发布时间】:2018-10-05 17:20:46
【问题描述】:

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

【问题讨论】:

  • 仅供参考,您的示例数据缺少关闭 &lt;/Artiste&gt; 标记。

标签: sql xml join xquery


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

【讨论】:

  • 感谢您的解释,它起作用了我不得不稍微更改返回语句并放置一个 xml 元素标签,但我猜这是因为 baseX 合成器。
【解决方案2】:

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

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 不是它的一部分。您可以通过用括号括住这两个部分来解决这个问题。

【讨论】:

  • 感谢您的解释,您的代码也有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
相关资源
最近更新 更多