如何将此SQL查询转换为XQuery?
如何将此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
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>