如何最好地修改以下语句,以便我收到带有 Address.Location 的 Contact.Name 列表(如果可能,我想使用 XPath 而不是子查询/WHERE 条件)?我在@@@Name 尝试了各种语法,但没有运气:( - 我想在那里引用原始节点。
DECLARE @data AS XML
SELECT @data = '
<Data>
<Contact Name="John"/>
<Contact Name="Bob"/>
<Address ContactName="John" Location="JohnStreet1"/>
<Address ContactName="John" Location="JohnStreet2"/>
<Address ContactName="Bob" Location="BobStreet1"/>
</Data>
'
SELECT
x.v.value('@Name','VARCHAR(255)') [Contact.Name],
y.v.value('@Location','VARCHAR(255)') [Address.Location]
FROM
@data.nodes('/Data[1]/Contact') AS x(v)
CROSS APPLY
x.v.nodes('/Data[1]/Address[@ContactName=@@@Name]') AS y(v)
ORDER BY
x.v.value('@Name','VARCHAR(255)')
PS。这不起作用,因为参数需要是文字:(
x.v.nodes('/Data[1]/Address[@ContactName=' + x.v.value('@Name','VARCHAR(255)') + ']') AS y(v)
请注意:目前我正在执行以下操作以获得所需的结果集(但不是以干净的 XPath 方式):
SELECT
x.v.value('@Name','VARCHAR(255)') [Contact.Name],
y.v.value('@Location','VARCHAR(255)') [Address.Location]
FROM
@data.nodes('/Data[1]/Contact') AS x(v)
CROSS APPLY
x.v.nodes('/Data[1]/Address') AS y(v)
WHERE
y.v.value('@ContactName','VARCHAR(255)')=x.v.value('@Name','VARCHAR(255)')
ORDER BY
x.v.value('@Name','VARCHAR(255)')