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>

我试过把 node1 放在子查询 PATH

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

或在子查询字段名称前加上 node1

Select field3 as 'node1/child1/field3',

但两者都为子查询创建了一个新的 node1 元素。

有谁知道我怎么能做到这一点?

谢谢

4

4 回答 4

0

你必须告诉 SQL Server table1 和 table2 是如何相关的。根据您在下面的回答,我认为这样的事情可能会奏效:

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>
于 2009-03-26T22:06:56.323 回答
0

我没有用 T-SQL 和 FOR XML 做很多工作,但是我通过在每个子查询之后调用查询的 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 所提到的,您需要确保您的数据正确连接。

我还加入了 Group By 子句,以确保数据不会“误入歧途”。我在将子查询数据复制为外部查询中每个条目的子项时遇到问题(每个节点下有多个子项,与有多少节点有关。)我确信有一个简单的解释,但我是当我这样做时,工作时间很紧,再也没有回去检查......

如果这是不正确的用法或任何人都可以阐明重复组,请指出,我会编辑...

于 2009-03-27T03:19:41.640 回答
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') 。外部查询字段用于 Root 下的许多不同节点路径。我需要子查询在 node1 下返回,还有其他子查询需要在 node2、node3 下返回......
我当然希望我说得通。这是我的第一篇文章,下次我会确保并发布更好的示例查询。

感谢您的回答。

短剑

于 2009-03-27T15:20:17.493 回答
0

如果您发布一些示例数据而不是使用 node1、field1、child1 等并解释数据来自哪些表,这可能更有意义。

XML 本质上是分层的。您不能随意启动与根下其他节点无关的新节点,这听起来像是您正在尝试做的事情。

<node1>..to..中的所有内容都</node1>与一条记录及其子查询生成的数据相关。下一个节点序列会将结构复制为<node2>..to..</node2>用于下一条记录。

如果你想在每个节点下有更多的子查询,那么只需在 SQL 中用自己的方式编写每个子查询FOR XML PATH('SubNodeName')

发布您的 XSD 或 XML 代码示例,我会看看我是否能弄清楚您想要做什么。

于 2009-03-28T00:19:54.420 回答