Though this works to return the right results,
SELECT r.开发者_C百科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.
Results:
@Key Key1 Col1
1 1 Table1Col1
1 1 Table2Col
The problem is that the results together doesn't differentiate between the different naming I'm trying to use, because of the UNION. How can I get both to display under one resultset but with different names? I'm thinking XML to do this, but am unable to figure out how?
What's an optimal way to combine different queries with different results/number of rows and put everything under one big XML?
Ok, the best I could come up with is:
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
Will give me results (again, as expected because of the Union)
@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>
or something on these lines:
<Root Key="1">
<Column1>
<Key1>1</Key1>
<Col1>Table1Col1</Col1>
</Column1>
<Column2>
<Key2>1</Key2>
<Col2>Tabl2Col</Col2>
</Column2>
</Root>
Are you looking for something like this?
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')
Result:
<root>
<Query1>
<KeyColumn>1</KeyColumn>
<Col1>Col1</Col1>
</Query1>
<Query2>
<KeyColumn>1</KeyColumn>
<Col2>Col2</Col2>
</Query2>
</root>
You can't do what you want. The UNION uses the column names from the first SELECT statement and unions the columns ijn the second (and subsequent) SELECTs. In other words, the first SELECT names the columns, and the SELECTs that follow are just considered to be additional rows of those columns.
If you want separate column names, use JOINS or multiple-table SELECTs instead.
精彩评论