Xml 如何在XQuery中进行自然连接

Xml 如何在XQuery中进行自然连接,xml,join,xquery,natural-join,Xml,Join,Xquery,Natural Join,我的目标是列出住在旧金山但在硅谷工作的员工。目前,我的条款旨在找出哪些员工居住在旧金山,但我不确定如何加入EmployeeList和WorkInfo这两个列表,以便找到居住在旧金山的员工,并找出其中哪些人也在硅谷工作 以下是我到目前为止在条款中的内容: for $x in /EmpDatabase/PersonList/Contents/Person where $x/City='San Fran' order by $x/Name return $x/Name 这是我的XML数据文件: &l

我的目标是列出住在旧金山但在硅谷工作的员工。目前,我的条款旨在找出哪些员工居住在旧金山,但我不确定如何加入EmployeeList和WorkInfo这两个列表,以便找到居住在旧金山的员工,并找出其中哪些人也在硅谷工作

以下是我到目前为止在条款中的内容:

for $x in /EmpDatabase/PersonList/Contents/Person
where $x/City='San Fran'
order by $x/Name
return $x/Name
这是我的XML数据文件:

<EmpDatabase>
<PersonList Type="Employee">
<Title Value="Employee List"/>
<Contents>
<Person>
    <Name>Susan L. Anderson</Name>
    <City>San Fran</City>
    <Gender>F</Gender>
</Person>
<Person>
    <Name>Dan L. Brady</Name>
    <City>Sacramento</City>
    <Gender>M</Gender>
</Person>
<Person>
    <Name>Peter K. Chen</Name>
    <City>San Fran</City>
    <Gender>M</Gender>
</Person>
</Contents>
</PersonList>

<CompanyList Type="Company">
<Title Value="Company List"/>
<Contents>
<Company>
    <Name>Google</Name>
    <City>Silicon Valley</City>
</Company>
<Company>
    <Name>Riot</Name>
    <City>LA</City>
</Company>
</Contents>
</CompanyList>

<InfoList Type="Works">
<Title Value="Works List"/>
<Contents>
<Works>
    <Name>Susan L. Anderson</Name>
    <Company>Google</Company>
    <Salary>48000</Salary>
</Works>
<Works>
    <Name>Dan L. Brady</Name>
    <Company>Google</Company>
    <Salary>42000</Salary>
</Works>
<Works>
    <Name>Peter K. Chen</Name>
    <Company>Riot</Company>
    <Salary>53000</Salary>
</Works>
</Contents>
</InfoList>
</EmpDatabase>

苏珊·L·安德森
旧金山
F
丹·L·布雷迪
萨克拉门托
M
陈国强
旧金山
M
谷歌
硅谷
暴乱
洛杉矶
苏珊·L·安德森
谷歌
48000
丹·L·布雷迪
谷歌
42000
陈国强
暴乱
53000
自然加入是正确的方法吗?自然连接是如何在XQuery中编写的?我是否需要在另一个文件中写一个单独的子句来列出在硅谷工作的员工,然后以某种方式将这两个子句的结果合并在一起


非常感谢您的帮助

我将
$x
重命名为
$person
,给它起了一个更有意义的名字

您可以制定隐式联接,但更容易制定实际需要的内容:

for $person in /EmpDatabase/PersonList/Contents/Person
(: retrieve company $person is working for :)
let $works := /EmpDatabase/InfoList/Contents/Works[Name=$person/Name]
where $person/City='San Fran'
(: See if the company has a department in Silicon Valley :)
where /EmpDatabase/CompanyList/Contents/Company[Name=$works/Company and City='Silicon Valley']
order by $person/Name
return $person/Name
如果您喜欢“经典”联接,只需对循环使用多个

for $person in /EmpDatabase/PersonList/Contents/Person
for $works in /EmpDatabase/InfoList/Contents/Works
for $company in /EmpDatabase/CompanyList/Contents/Company
where $person/City='San Fran'
where $person/Name=$works/Name
where $works/Company=$company/Name
where $company/City='Silicon Valley'
order by $person/Name
return $person/Name

非常感谢。嵌套for循环结构很有意义。然而,当我运行它时,我得到了以下错误:
error:err:XPST0003:表达式结尾后出现意外字符(可能还有一个右括号)in:for$person in/EmpDatabase/PersonList/Contents/person for$works in/EmpDatabase/InfoList/Contents/works for$company in/EmpDatabase/CompanyList/Contents/companywhere$person/City='San Fran'where$person/Name=$works/Name where[嗯,这是第二个
where
子句。您使用的是什么查询处理器?请尝试将除第一个
where
之外的所有
替换为