我是XQuery的新手,我正在努力找出一些非常简单的东西,但我似乎失败了。 我在公司中有一个Employees的XML文件,如下所示:
<dataroot>
<employee>
<fname>John</fname>
<minit>B</minit>
<lname>Smith</lname>
<ssn>123456789</ssn>
<bdate>1965-01-09</bdate>
<address>731 Fondren, Houston, TX</address>
<sex>M</sex>
<salary>30000</salary>
<superssn>333445555</superssn>
<dno>5</dno>
</employee>
<employee>
<fname>Franklin</fname>
<minit>T</minit>
<lname>Wong</lname>
<ssn>333445555</ssn>
<bdate>1955-12-08</bdate>
<address>638 Voss, Houston, TX</address>
<sex>M</sex>
<salary>40000</salary>
<superssn>888665555</superssn>
<dno>5</dno>
</employee>
...etc
这对所有员工来说都是如此。我还有一个Dependents XML文件,如下所示:
<dependent>
<essn>123456789</essn>
<dependent_name>Alice</dependent_name>
<sex>F</sex>
<bdate>1988-12-30</bdate>
<relationship>daughter</relationship>
</dependent>
<dependent>
<essn>123456789</essn>
<dependent_name>Elizabeth</dependent_name>
<sex>F</sex>
<bdate>1967-05-05</bdate>
<relationship>spouse</relationship>
</dependent>
...and so on
我的问题是,我试图运行一个XQuery,它返回与该依赖关系相关的员工的依赖关系,名字和姓氏的名称以及该员工的名字和姓氏。的经理。 我在访问经理信息方面遇到了麻烦,因为经理的ssn必须与员工的ssn进行比较才能得到经理的姓名(正式员工和经理都是员工档案的一部分)。
这是我到目前为止所做的:
<results>
{
for $e in doc("../company/employee.xml")//employee,
$m in doc("../company/employee.xml")//employee
$d in doc("../company/dependent.xml")//dependent
return
<ans
dname="{ $d/dependent_name }"
emp fname="{ $e/fname }"
emp lname="{ $e/lname }"
mgr fname="{ } (: *this is where I get lost* :)
/>
}
</results>
所以我想我的具体问题是: 看到我可以从Employee.xml访问每个Employee,并且每个Dependent从Dependent.xml文件访问而不使用条件(WHERE $ e / superssn = $ m / essn)如何返回所有这些值,因为只有一个返回结果需要条件语句吗?
答案 0 :(得分:0)
我没有完全得到您的实际问题以及为什么您不希望成为一个条件,但在我看来,因为您在XQuery中缺少或混淆了一些概念。
首先,如果你写
for $e in doc("../company/employee.xml")//employee,
$m in doc("../company/employee.xml")//employee
$d in doc("../company/dependent.xml")//dependent
这是三个交错的for循环,这似乎完全没必要。如果我理解正确,您希望得到一名员工及其所有家属和员工经理。您应该使用let
来实现此目标
for $e in doc("../company/employee.xml")/dataroot/employee
for $d in doc("../company/dependent.xml")//dependent[essn = $e/ssn]
let $m in doc("../company/employee.xml")/dataroot/employee[ssn = $e/superssn]
return
<ans
dname="{ $d/dependent_name }"
emp fname="{ $e/fname }"
emp lname="{ $e/lname }"
mgr fname="{ $m/fname }
/>
我还用一个具体的步骤替换了//
。您应该尽可能避免//
,因为它必须搜索整个树,这可能非常大。
请使用比$m
更有意义的变量名称。 $manager
更容易阅读,而且不会花费你的费用。