0

如何将此 SQL 查询转换为等效的 XQuery

SELECT e.essn AS one, f.essn AS two, e.pno, f.pno 
FROM works_on AS e JOIN works_on AS f on e.pno = f.pno 
AND e.essn < f.essn \n" . "ORDER BY `e`.`pno` ASC

到目前为止我已经尝试过了,但它没有给出预期的结果

let $prods := doc("../company/works_on.xml")//works_on[pno = $project/pnumber]
for $d in distinct-values($prods/essn),
$n in distinct-values($prods[essn = $d]/pno)
return <result essn="{$d}" pno="{$n}"/>

这是我正在使用的 XML 文件的示例。

<dataroot>

    <works_on>

        <essn>123456789</essn>

        <pno>1</pno>

        <hours>32.5</hours>

    </works_on>

    <works_on>

        <essn>123456789</essn>

        <pno>2</pno>

        <hours>7.5</hours>

    </works_on>

    <works_on>

        <essn>333445555</essn>

        <pno>2</pno>

        <hours>10</hours>

    </works_on>

    <works_on>

        <essn>333445555</essn>

        <pno>3</pno>

        <hours>10</hours>

    </works_on>

这是到目前为止的输出

<results>
  <project>
    <pnumber>1</pnumber>
    <employee>
      <essn>123456789</essn>
      <essn>453453453</essn>
    </employee>
  </project>
  <project>
    <pnumber>2</pnumber>
    <employee>
      <essn>123456789</essn>
      <essn>333445555</essn>
      <essn>453453453</essn>
    </employee>
  </project>
  <project>
    <pnumber>3</pnumber>
    <employee>
      <essn>333445555</essn>
      <essn>666884444</essn>
    </employee>
  </project>
  <project>
    <pnumber>10</pnumber>
    <employee>
      <essn>333445555</essn>
      <essn>987987987</essn>
      <essn>999887777</essn>
    </employee>
  </project>
  <project>
    <pnumber>20</pnumber>
    <employee>
      <essn>333445555</essn>
      <essn>888665555</essn>
      <essn>987654321</essn>
    </employee>
  </project>
  <project>
    <pnumber>30</pnumber>
    <employee>
      <essn>987654321</essn>
      <essn>987987987</essn>
      <essn>999887777</essn>
    </employee>
  </project>
</results>

我试图将 essn 的值成对,例如,在项目 1 上,它将保持原样,但对于项目 2,将有 123456789 和 333445555 作为一对,123456789 和 453453453 作为另一对,最后是 333445555和 453453453 作为最后一对。它们应该是非重复和非反向对。

4

1 回答 1

0

为了简洁起见,您提供的 XML 已被删减(顺便说一句,这是个好主意),但是 - 这使得您的问题有点难以理解 - 它不再与您预期的输出相对应。

目前我坐在SQL-Server前面,所以测试代码是T-SQL,但是XQuery的思路应该和其他引擎一样:

--你的 XML

DECLARE @xml XML=
N'<dataroot>
  <works_on>
    <essn>123456789</essn>
    <pno>1</pno>
    <hours>32.5</hours>
  </works_on>
  <works_on>
    <essn>123456789</essn>
    <pno>2</pno>
    <hours>7.5</hours>
  </works_on>
  <works_on>
    <essn>333445555</essn>
    <pno>2</pno>
    <hours>10</hours>
  </works_on>
  <works_on>
    <essn>333445555</essn>
    <pno>3</pno>
    <hours>10</hours>
  </works_on>
</dataroot>'; 

--带有嵌入式 XQuery 的 T-SQL-Query

SELECT @xml.query
('<results>
  {
  for $p in distinct-values(/dataroot/works_on/pno/text())
  order by $p
  return <project><pnumber>{$p}</pnumber>
         <employee>
         {
         for $e in distinct-values(/dataroot/works_on[pno=$p]/essn/text())
         order by $e
         return <essn>{$e}</essn>
         }
         </employee>
         </project>
  } 
  </results>')

结果(对于缩短的 XML)

<results>
  <project>
    <pnumber>1</pnumber>
    <employee>
      <essn>123456789</essn>
    </employee>
  </project>
  <project>
    <pnumber>2</pnumber>
    <employee>
      <essn>123456789</essn>
      <essn>333445555</essn>
    </employee>
  </project>
  <project>
    <pnumber>3</pnumber>
    <employee>
      <essn>333445555</essn>
    </employee>
  </project>
</results>

简而言之:

我们找到一个不同的项目编号列表,并用项目编号写出主要的输出结构。在内部,我们创建元素并用在 any 下方找到的值<employee>填充它,其中a作为当前数字<essn><works_on><pno>

希望这可以帮助...

于 2019-11-05T11:21:29.893 回答