【问题标题】:SQL & XML - reducing duplicate dataSQL & XML - 减少重复数据
【发布时间】:2021-08-21 22:33:49
【问题描述】:

寻找一种使用FOR XML 减少重复数据的方法。

这是架构和数据:

create table #area (StateId int, State varchar(10), Population int)
go
insert into #area values (1, 'AZ', 10000)
go
create table #person (Id int, FirstName varchar(10), LastName varchar(10), StateFk int)
go
insert into #person values (1, 'Joe', 'Smith', 1), (2, 'Jane', 'Doe', 1)
go

select a.State as '@State'
    , a.Population as '@Population'
    , p.FirstName as 'Person/FirstName'
    , p.LastName as 'Person/LastName'
from #area a
inner join #person p on a.StateId = p.StateFk
where a.Id = 1
for xml path('Record'), root ('RecordSet')
go

结果如下:

<RecordSet>
  <Record State="AZ" Population="10000">
    <Person>
      <FirstName>Joe</FirstName>
      <LastName>Smith</LastName>
    </Person>
  </Record>
  <Record State="AZ" Population="10000">
    <Person>
      <FirstName>Jane</FirstName>
      <LastName>Doe</LastName>
    </Person>
  </Record>
</RecordSet>

但由于#area 数据是静态的,我想减少重复数据。使用FOR XML,我怎么能写出这样的结果:

<RecordSet>
    <State>AZ</State>
    <Population>10000</Population>
    <Person>
        <FirstName>Joe</FirstName>
        <LastName>Smith</LastName>
    </Person>
    <Person>
        <FirstName>Jane</FirstName>
        <LastName>Doe</LastName>
    </Person>
</RecordSet>

或者这个:

<RecordSet State="AZ" Population="1000">
    <Person>
        <FirstName>Joe</FirstName>
        <LastName>Smith</LastName>
    </Person>
    <Person>
        <FirstName>Jane</FirstName>
        <LastName>Doe</LastName>
    </Person>
</RecordSet>

【问题讨论】:

    标签: tsql sql-server-2012 for-xml-path


    【解决方案1】:

    nm,用子查询解决

    select a.State as '@State'
        , a.Population as '@Population'
        , (select p.FirstName as 'Person/FirstName'
            , p.LastName as 'Person/LastName'
            from #person p 
            where p.stateFk = a.StateId
            for xml path('')
        ) as 'Persons'
    from #area a
    for xml path('Record'), root ('RecordSet')
    go
    

    【讨论】:

    • for xml path(''), type 会更有效,因为它将它保存在 xml 数据类型中
    猜你喜欢
    • 2022-11-25
    • 2020-06-02
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    相关资源
    最近更新 更多