#sql #xml #rows #cascade
#sql #xml #строки #каскад
Вопрос:
У меня есть следующие строки:
ID|Customer | Part Number | Part Number Price | Hardware ID | Hardware Value
------------------------------------------------------------------------------
1 | John | 15 | 10 | 1 | 1000
2 | John | 16 | 15 | 2 | 500
Результат, который я пытаюсь получить в SQL Server, выглядит следующим образом:
<Order>
<Customer>John</Customer>
<PartNumbers>
<PartNumber>15</PartNumber><PartNumberPrice>10</PartNumberPrice>
<PartNumber>16</PartNumber><PartNumberPrice>15</PartNumberPrice>
</PartNumbers>
<Hardware>
<HardwareId>1</HardwareId><HardwareValue>1000</HardwareValue>
<HardwareId>1</HardwareId><HardwareValue>500</HardwareValue>
</Hardware>
</Orders>
Есть идеи, как решить эту проблему?
Спасибо!
Ответ №1:
declare @T table
(
ID int,
Customer varchar(10),
[Part Number] int,
[Part Number Price] int,
[Hardware ID] int,
[Hardware Value] int
)
insert into @T values
(1, 'John', 15, 10, 1, 1000),
(2, 'John', 16, 15, 2, 500)
select T1.Customer as Customer,
(select T2.[Part Number] as PartNumber,
T2.[Part Number Price] as PartNumberPrice
from @T as T2
where T1.Customer = T2.Customer
for xml path(''), root('PartNumbers'), type),
(select T2.[Hardware ID] as HardwareId,
T2.[Hardware Value] as HardwareValue
from @T as T2
where T1.Customer = T2.Customer
for xml path(''), root('Hardware'), type)
from @T as T1
group by T1.Customer
for xml path(''), root('Order')
Ответ №2:
Это может выглядеть немного забавно с самосоединениями, но это только потому, что ваши таблицы не нормализованы должным образом. Возможно, вам также захочется рассмотреть имена столбцов без пробелов.
SELECT Customer as Customer,
(SELECT DISTINCT o.[Part Number] partNumber,o.[Part Number Price] PartNumberPrice
FROM yTable o
where t.id = o.id
FOR XML AUTO, TYPE),
(SELECT DISTINCT x.[Hardware ID] hardwareid,x.[Hardware Value] hardwarevalue
FROM yTable x
where t.id = x.id
FOR XML AUTO, TYPE)
FROM yTable t
FOR XML AUTO, TYPE
Комментарии:
1. Столбцы, перечисленные в этом вопросе, являются лишь примером. Но вы правы.