次のステートメントを変更して、Address.Locationを含むContact.Nameのリストを受け取るにはどうすればよいですか(可能な場合はサブクエリ/ WHERE条件ではなくXPathを使用したい)。@@@ 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)')