Sql 使用UNION组合不同的表列,并使用XML区分列名

Sql 使用UNION组合不同的表列,并使用XML区分列名,sql,xml,sql-server-2008,for-xml-path,Sql,Xml,Sql Server 2008,For Xml Path,虽然这可以返回正确的结果 SELECT r.KeyColumn as '@Key', t1.Key1 as 'Key1', t1.Col1 as 'Col1' FROM @resultset r INNER JOIN Table1 t1 ON t1.Col1 = 'SomeCondition' --FOR XML PATH('Column1') -- This errors out when used with union, works as a seperate query. UNION

虽然这可以返回正确的结果

SELECT r.KeyColumn as '@Key', t1.Key1 as 'Key1', t1.Col1 as 'Col1' 
FROM @resultset r
INNER JOIN Table1 t1 ON t1.Col1 = 'SomeCondition'
--FOR XML PATH('Column1')  -- This errors out when used with union, works as a seperate query.

UNION
SELECT r.KeyColumn as '@Key', t2.Key1 as 'Key2', t2.Col2 as 'Col2' 
FROM @resultset r
INNER JOIN Table2 t2 ON t2.Col1 = 'SomeCondition2'
--FOR XML PATH('Column2')  -- This errors out when used with union, works as a seperate query.
结果:

@Key Key1  Col1
1   1  Table1Col1
1   1  Table2Col
问题是,由于联合,结果在一起无法区分我尝试使用的不同命名。如何使两者都显示在一个结果集下,但名称不同?我正在考虑用XML来做这件事,但我不知道怎么做

将具有不同结果/行数的不同查询组合在一起并将所有内容放在一个大XML下的最佳方式是什么

好的,我能想到的最好的办法是:

SELECT r.KeyColumn as '@Key', t1.Key1 as 'Key1', t1.Col1 as 'Col1',  '' as 'Key2', '' as 'Col2'
          FROM @resultset r
    INNER JOIN Table1 t1 ON t1.Col1 = 'SomeCondition'
    --FOR XML PATH('Column1')  --Error

     UNION 

     SELECT r.KeyColumn as '@Key', '' AS 'Key1', '' as 'Col1', t2.Key1 as 'Key2', t2.Col2 as 'Col2' 
    FROM @resultset r
    INNER JOIN Table2 t2 ON t2.Col1 = 'SomeCondition2'
    --FOR XML PATH('Column2')  -- Error
会再次给我结果,因为工会的缘故

    @Key    Key1        Col1        Key2    Col2
---------------------------------------------------------------------------
    1       1           Table1Col1
    1                               1       Table2Col

I still want to get my results as an XML thus:

<Root>
<Column1 Key="1">
  <Key1>1</Key1>
  <Col1>Table1Col1</Col1>
</Column1>

<Column2 Key="1">
  <Key2>1</Key2>
  <Col2>Tabl2Col</Col2>
</Column2>
</Root>
或者在这些方面:

 <Root Key="1">
    <Column1>
      <Key1>1</Key1>
      <Col1>Table1Col1</Col1>
    </Column1>

    <Column2>
      <Key2>1</Key2>
      <Col2>Tabl2Col</Col2>
    </Column2>
    </Root>

你不能做你想做的事。UNION使用第一个SELECT语句中的列名,并将第二个和后续SELECT语句中的列ijn联合起来。换句话说,第一个SELECT命名列,后面的SELECT仅被视为这些列的附加行


如果需要单独的列名,请改用联接或多个表选择。

是否需要类似的名称

declare @T table 
(
  KeyColumn int,
  Col1 varchar(10),
  Col2 varchar(10)
)

insert into @T values(1, 'Col1', 'Col2')

select (
         select KeyColumn,
                Col1
         from @T
         for xml path('Query1'), type       
       ),
       (
         select KeyColumn,
                Col2
         from @T
         for xml path('Query2'), type       
       )
for xml path('root')
结果:

<root>
  <Query1>
    <KeyColumn>1</KeyColumn>
    <Col1>Col1</Col1>
  </Query1>
  <Query2>
    <KeyColumn>1</KeyColumn>
    <Col2>Col2</Col2>
  </Query2>
</root>

如何在for XML路径中同时使用多个表选择?我不想要嵌套的XML,而是相同级别的节点。你能给我举个例子吗?非常感谢。是的,就是这样。我也只是在网上多做了一点调查后才发现。。然后注意到你的回答!我只是想看看是否有更好的方法来实现这一点,因为我有大约4-5个内部选择来创建6-7个级别的XML节点。