2012-05-04 18 views
2

次の兄弟値を取得する:は、私はこのようになりますテーブルを持っている

CREATE TABLE CustomerXmlData 
(CustomerId int, 
CustomerData xml) 

CustomerIdの主要顧客テーブルへのリンクとCustomerDataは、このようなXML文書であります

<Person> 
    <Product> 
    <Name>ABC</Name> 
    <Value>500</Value> 
    </Product> 
    <Product> 
    <Name>XYZ</Name> 
    <Value>600</Value> 
    </Product> 
</Person> 

このような行は数十万件あります。擬似コードでは、私がしたいことは、ValueProductValueの場合、Name = 'XYZ' "となります。

要素の属性に基づいて値を取得する方法や、ドキュメント内で一意の親を持つことに基づいて値を取得する方法はわかっていますが、どちらもこの状況での使用ではありません。私は私が欲しいと思っているNameを見つけて、次の兄弟の価値を得ることができる何かを見つけることができません。

私はFOR XMLを使用してエッジテーブルを作成できますが、それをカーソルでループする必要がありますか?私はより効率的なソリューションを望んでいます。

+1

それは、それは(そのXMLテーブルの上にあなた)のXQueryをサポートしているSQL Server 2005の場合です。 http://msdn.microsoft.com/en-us/library/ms345122%28v=sql.90%29.aspx – BigMike

+1

私はXPathのビットを知っていました....今私はもう少し知っています。多くの感謝 –

答えて

1

は(名前でフィルタリングするために編集された)、これを試してみてください:

DECLARE @Name VARCHAR(50) 
SET @Name = 'XYZ' 

SELECT Name, AVG(Value) 
FROM (
SELECT 
    c.value('Name[1]', 'VARCHAR(50)') AS Name 
    , c.value('Value[1]', 'DECIMAL') AS Value 
FROM CustomerXmlData 
CROSS APPLY CustomerData.nodes('//Product[Name = sql:variable("@Name")]') AS t(c) 
) T 
GROUP BY Name 
4

私は私が次の兄弟の値を取得し、私がしたい名前と を見つけるようになる何かを見つけることができません。あなたは、XPathのビットは多分良い出発点となることを知っている場合

declare @Name varchar(10) 
set @Name = 'XYZ' 

select N.value('.', 'int') as Value  
from CustomerXmlData 
    cross apply CustomerData.nodes 
    ('/Person/Product[Name = sql:variable("@Name")]/Value') as T(N) 
+0

正しい答えをUpvoting。私は「WHERE Name = 'XYZ'」というビットを見逃してしまった。私の答えを編集しました。 –

関連する問題