如何将此SQL查询转换为XQuery?

如何将此SQL查询转换为XQuery?,sql,xml,xquery,Sql,Xml,Xquery,如何将此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 选择e.essn为一,f.essn为二,e.pno,f.pno 从作为e的工作连接作为f的工作连接e.pno=f.pno 和e.es

如何将此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
选择e.essn为一,f.essn为二,e.pno,f.pno
从作为e的工作连接作为f的工作连接e.pno=f.pno
和e.essn
到目前为止,我已经试过了,但没有达到预期的效果

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}"/>
let$prods:=doc(“../company/works\u on.xml”)///works\u on[pno=$project/pnumber]
不同价值的$d($prods/essn),
不同值中的$n($prods[essn=$d]/pno)
返回
这是我正在使用的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>

123456789
1.
32.5
123456789
2.
7.5
333445555
2.
10
333445555
3.
10
这是目前为止的输出

<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>

1.
123456789
453453453
2.
123456789
333445555
453453453
3.
333445555
666884444
10
333445555
987987987
999887777
20
333445555
888665555
987654321
30
987654321
987987987
999887777

我正在尝试将essn的值分成两对,例如,在项目1中,它将保持原样,但对于项目2,将123456789和33344555作为一对,123456789和453453453作为另一对,最后33344555和453453作为最后一对。它们应该是非重复和非反转的对。

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

目前我坐在SQL Server前面,所以测试代码是T-SQL,但XQuery的思想应该与其他引擎相同:

--您的XML

DECLARE@xml=
不
123456789
1.
32.5
123456789
2.
7.5
333445555
2.
10
333445555
3.
10
'; 
--带有嵌入式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>')
SELECT@xml.query
('
{
对于不同值(/dataroot/works\u on/pno/text())中的$p
按$p订购
返回{$p}
{
对于不同值的$e(/dataroot/works_on[pno=$p]/essn/text())
以$e订购
返回{$e}
}
} 
')
结果(对于缩短的XML)


1.
123456789
2.
123456789
333445555
3.
333445555
简而言之:

我们找到一个项目编号的明确列表,并用项目编号写出主要输出结构。我们在内部创建
元素,并用
在任何
下找到的值填充它,该具有一个
作为当前编号


希望这有助于

读者可能会问你试过什么。你能在你的问题中加上这个吗?这将有助于他们看到你特别迷恋什么。我添加了它太棒了!现在,您可以展示一个有代表性的
works\u on.xml
,您的实际输出是什么,以及您想要什么吗?如果你能及时做到这一点,我们就可以停止这个问题被搁置(或者,如果当时它已经关闭了,我们可以投票重新打开它)。我已经添加了更多的信息更好-谢谢你。这不是我能帮忙的事,但其他人可能能。
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>')
<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>