2009-03-26 7 views
0

私はこれが生成する次のクエリ"XMLパスの" MS SQL 2005ノードレイアウト質問

Select field1 as 'node1/field1', 
     field2 as 'node1/field2', 
    (Select field3 as 'child1/field3', 
      field4 as 'child1/field4' 
    From table2 
    FOR XML PATH(''),TYPE,Elements) 
From Table1 FOR XML PATH('Root'),Elements 

を持っている:

<Root> 
    <node1> 
    <field1>data1</field1> 
    <field2>data2</field2> 
    </node1> 
    <child1> 
    <field3>data3</field3> 
    <field4>data4</field4> 
    </child1> 
    <child1> 
    ... 
</Root> 

を、私は、child1のノードがnode1の一部ではないと希望下の別のノード。

<Root> 
    <node1> 
    <field1>data1</field1> 
    <field2>data2</field2> 
    <child1> 
     <field3>data3</field3> 
     <field4>data4</field4> 
    </child1> 
    <child1> 
     ... 
</node1> 
<node1> 
    ... 
</Root> 

私は、サブクエリのPATH

FOR XML PATH('node1'),TYPE,Elements) 

またはノード1

Select field3 as 'node1/child1/field3', 

とサブクエリのフィールド名を接頭辞にノード1を入れて試してみたが、両方は、サブクエリのための新しいノード1の要素を作成します。

どのように私はこれを達成することができます知っていますか?

おかげ

答えて

0

あなたはお奨めどのように関連しているかTABLE1とtable2のSQL Serverに指示しました。下のあなたの答えに基づいて、私はこのようなものは、トリックを行うかもしれないと思う:

select 
    table1.field1 as 'Node1/Field1' 
, table2.field1 as 'Node1/Child1/Field1' 
, table1.field2 as 'Node2/Field2' 
from table1 
left join table2 on table1.id = table2.table1id 
for xml PATH(''), ROOT('Root') 

これは、のようなXMLを生成する必要があります

<Root> 
    <Node1> 
     <Field1>Value</Field1> 
     <Child1> 
      <Field1>Value</Field1> 
     </Child1> 
    </Node1> 
    <Node2> 
     <Field2>Value</Field2> 
    </Node2> 
</Root> 
+0

こんにちはAndomar 私のサブクエリで正しいデータを返すことができますが、それはルートの子ノードとして返します。私はchild1ノードがrootの一部ではなくnode1の一部である必要があります。 – Dirk

+0

child1がnode1にどのように関係しているか、SQL Serverにどのように伝えていますか? – Andomar

0

私はT-SQLで多くの作業を行っていませんでしたし、

SELECT field1 as "Field1", 
    field2 as "Field2", 
    (select 
     field3 as "Field3", 
     field4 as "Field4" 

     from table2 t2 inner join 
     tlink tl on tl.id = t2.id inner join 
     table2 on t2.id = tl.id 
     group by field3, field4 
     FOR XML PATH ('Child'), type 
     ) 

from table2 t2 
group by field1, field2 
FOR XML PATH('Node'), ROOT('Root') 

これが返されます:XMLのために、私は以下のように、各サブクエリの後に、クエリのXMLの一部を呼びかけ、およびノー​​ドを設定するにはパス識別子を使用して同様の問題ラウンドだ

<Root> 
    <Node1> 
    <Field1>data1</Field1> 
    <Field2>data2</Field2> 
    <Child1> 
     <Field3>data3</Field3> 
     <Field4>data4</Field4> 
    </Child1> 
    </Node1> 
    <Node2> 
    <Field1>data1.2</Field1> 
    <Field2>data2.2</Field2> 
    <Child2> 
     <Field3>data3.2</Field3> 
     <Field4>data4.2</Field4> 
    </Child2> 

... 
    </Node2> 

... 
</Root> 

Andomarが述べたように、データが正しく結合されていることを確認する必要があります。

私はGroup By節を持って、データが「迷子にならない」ことを確認しました。私は、サブクエリデータが外部クエリーの各エントリの子として複製されている問題を抱えていました(各ノードの下に複数の子ノードがあったことに関連して複数の子ノードがありました)。私はこれをしなかったし、これは繰り返しグループに光を当てることができ、誤った使用方法や、誰もがある場合は、それを指摘して、私は...

を編集しますしてください

...チェックするために戻って行ったことがないときタイトなスケジュールに取り組んで

0

私の最初のサンプルクエリは、あなたが指摘したように正しくはありませんでした。ここでは、より正確なサンプルクエリです。生成

Select field1 as 'node1/field1',  
     field2 as 'node1/field2', 
    (Select field3 as 'child1/field3',   
     field4 as 'child1/field4' 
    From table2 
    Where table1.ID = table2.ID 
    FOR XML PATH(''),TYPE,Elements), 
     field5 as 'node2/field5', 
     field6 as 'node2/field6' 
From table1 FOR XML PATH('Root'),Elements 

<Root> 
    <node1> 
    <field1>data1</field1> 
    <field2>data2</field2> 
    </node1> 
    <child1>  
    <field3>data3</field3> 
    <field4>data4</field4> 
    </child1> 
    <node2> 
    <field5>data5</field5> 
    <field6>data6</field6> 
    </node2> 
</Root> 

フィールド5とfield6は、外側のクエリのフィールドであるが、異なるノード・パス、NODE2の範囲内です。これが私が外側のクエリにPATH( 'ノード')を持つことができない理由です。外側のクエリフィールドは、ルートの下の多くの異なるノードパスで使用されます。私は、node1の下で再帰するためにサブクエリが必要であり、node2、node3の下で返さなければならない他のサブクエリがあります...
私は理に適っていると確信しています。 これは私の最初の投稿です。次回はより良いサンプルクエリを確実に投稿して投稿します。

お返事ありがとうございます。

ディルク

+0

この回答を基に編集されました – Andomar

0

それはあなたには、いくつかのサンプルデータを投稿した場合、むしろノード1、フィールド1を使用するよりも理にかなってchild1のなど、データがから来ているテーブルを説明するかもしれません。

XMLは本来階層的です。ルートの下にある他のノードに関係しない新しいノードを任意に開始することはできません。これは実行しようとしているようなものです。

<node1>内のすべて。.. </node1>は、1つのレコードとそのサブクエリによって生成されたデータに関連しています。次のノードシーケンスは、次のレコードのために<node2> .. .. </node2>という構造体を複製します。

あなたは、各ノードの下に複数のサブクエリをしたい場合は、単に独自のFOR XML PATH('SubNodeName')

とSQLにそれぞれ1を書き込むには、あなたのXSDまたはXMLコードのサンプルを投稿し、私が何をうまくできるかどうか私が表示されますあなたがしようとしている。