【问题标题】:Combine different table columns with UNION and use XML to differentiate the column names用UNION组合不同的表列,用XML区分列名
【发布时间】:2011-05-25 00:12:56
【问题描述】:

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

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

问题在于,由于 UNION 的原因,结果并不能区分我尝试使用的不同命名。如何让两者都显示在一个结果集下但名称不同?我正在考虑用 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>

【问题讨论】:

    标签: sql xml sql-server-2008 for-xml-path


    【解决方案1】:

    你在寻找这样的东西吗?

    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>
    

    【讨论】:

    • 是的,就是这样。我也只是在网上研究了一点后才弄清楚..然后注意到你的回复!我只是想看看是否有更好的方法来做到这一点,因为我有大约 4-5 个内部选择来创建 6-7 级 XML 节点。
    【解决方案2】:

    你不能做你想做的事。 UNION 使用第一个 SELECT 语句中的列名,unions 使用第二个(和后续)SELECT 中的列。换句话说,第一个 SELECT 为列命名,而后面的 SELECT 仅被视为这些列的附加行。

    如果您想要单独的列名,请改用 JOINS 或多表 SELECT。

    【讨论】:

    • 如何在一个 for XML PATH 中同时使用多表选择?我不想要嵌套的 XML,而是相同级别的节点。你可以给我一个例子吗?谢谢!!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多