0

次のクエリがあります

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にnode1を入れてみました

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

または、サブクエリ フィールド名の前に node1 を付けます

Select field3 as 'node1/child1/field3',

ただし、どちらもサブクエリの新しい node1 要素を作成します。

これを達成する方法を知っている人はいますか?

ありがとう

4

4 に答える 4

0

T-SQLとFORXMLで多くの作業を行ったことはありませんが、以下のように、各サブクエリの後にクエリのFOR XML部分を呼び出し、PATH識別子を使用して設定することで同様の問題を回避しました。ノード:

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')

これは次を返します:

<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が述べたように、データが正しく結合されていることを確認する必要があります。

また、データが「迷わない」ようにするためのGroupBy句もあります。サブクエリデータが外部クエリの各エントリの子として複製されることに問題がありました(ノードの数に関連して各ノードの下に複数の子がありました)。簡単な説明があると思いますが、私は私がこれをしたとき、タイトなスケジュールに取り組んでいて、チェックに戻ることはありませんでした...

これが間違った使用法であるか、誰かが繰り返しグループに光を当てることができる場合は、それを指摘してください、そして私は編集します...

于 2009-03-27T03:19:41.640 に答える
0

node1、field1、child1などを使用するのではなく、サンプルデータを投稿して、データがどのテーブルからのものであるかを説明する方が理にかなっている場合があります。

XMLは本質的に階層的です。ルートの下にある他のノードに関連しない新しいノードを任意に開始することはできません。これは、あなたがやろうとしているように聞こえます。

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

各ノードの下にさらにサブクエリが必要な場合は、SQLでそれぞれを独自のサブクエリで記述します。FOR XML PATH('SubNodeName')

XSDまたはXMLコードのサンプルを投稿してください。そうすれば、あなたがやろうとしていることを理解できるかどうかを確認します。

于 2009-03-28T00:19:54.420 に答える
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>

field5 と field6 は外側のクエリからのフィールドですが、異なるノード パス node2 内にあります。これが、外側のクエリで PATH('node') を使用できない理由です。外側のクエリ フィールドは、ルートの下のさまざまなノード パスで使用されます。ノード 1 の下でサブクエリを返す必要があり、ノード 2、ノード 3 の下で返す必要のあるサブクエリが他にもあります...
意味があることを願っています。これは私の最初の投稿であり、次回はより良いサンプル クエリを投稿するようにします。

答えてくれてありがとう。

ダーク

于 2009-03-27T15:20:17.493 に答える