Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Создать XML-структуру из 2-х таблиц  [new]
uncertain
Member

Откуда:
Сообщений: 2
Здравствуйте.

Прошу помочь в решении следующей задачи:
Есть две таблицы: Person (в ней данные по людям) и Accounts (в ней данные по счетам этих людей).

CREATE TABLE [Person](
	[ID] [nvarchar](50) COLLATE Cyrillic_General_CI_AS NOT NULL CONSTRAINT Person_ID PRIMARY KEY,
	[F] [nvarchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[I] [nvarchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[O] [nvarchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[Seria] [nvarchar](50) COLLATE Cyrillic_General_CI_AS NULL,
	[Nomer] [nvarchar](50) COLLATE Cyrillic_General_CI_AS NULL,
        [Kod_sub] [nvarchar](10) COLLATE Cyrillic_General_CI_AS NULL,
        [Address] [nvarchar](200) COLLATE Cyrillic_General_CI_AS NULL,
) ON [PRIMARY]

GO
;


CREATE TABLE [Accounts](
	[ID] [nvarchar](50) COLLATE Cyrillic_General_CI_AS NOT NULL,
	[Account] [nvarchar](20) COLLATE Cyrillic_General_CI_AS NOT NULL,
	[Rest] [numeric](18, 2) NULL,
	[Vid_acc] [nvarchar](50) COLLATE Cyrillic_General_CI_AS NULL
) ON [PRIMARY]

GO
;


Заполнение тестовыми данными:

INSERT INTO [Person] VALUES ('11111111111','Иванов', 'Иван', 'Иванович', '11 11', '111111', '01', 'г.Москва')
INSERT INTO [Person] VALUES ('22222222222','Петров', 'Петр', 'Петрович', '22 22', '222222', '02', 'г.Санкт-Петербург')

INSERT INTO [Accounts] VALUES ('22222222222', '1AAA457765', 150.00, 'Текущий счет')
INSERT INTO [Accounts] VALUES ('22222222222', '1BBB453534', 250.00, 'Текущий счет')
INSERT INTO [Accounts] VALUES ('11111111111', '01110294Y3', 1250.50, 'Текущий счет')
INSERT INTO [Accounts] VALUES ('11111111111', '02220294Y3', 1050.50, 'Текущий счет')


Соответственно, ID в обеих таблицах - это некий уникальный номер человека. У каждого человека может быть несколько счетов в таблице Accounts. В то же время в таблице Person могут быть такие люди, у которых вообще нет счетов.

Мне нужно создать на основе данных из этих двух таблиц XML-документ следующего вида:

<Root>
  <Человек Номер="11111111111">
    <ПерсИнфо>
      <ФИО Фамилия="Иванов" Имя="Иван" Отчество="Иванович" />
      <Паспорт Серия="11 11" Номер="111111" />
      <Адрес КодСубъекта="01" Адрес="г.Москва" />
    </ПерсИнфо>
    <Счета>
      <Счет ВидСчета="Текущий счет" НомерСчета="02220294Y3" Остаток="1050.50" />
      <Счет ВидСчета="Текущий счет" НомерСчета="01110294Y3" Остаток="1250.50" />
    </Счета>
  </Человек>
  <Человек Номер="22222222222">
    <ПерсИнфо>
      <ФИО Фамилия="Петров" Имя="Петр" Отчество="Петрович" />
      <Паспорт Серия="22 22" Номер="222222" />
      <Адрес КодСубъекта="02" Адрес="г.Санкт-Петербург" />
    </ПерсИнфо>
    <Счета>
      <Счет ВидСчета="Текущий счет" НомерСчета="1BBB453534" Остаток="250.00" />
      <Счет ВидСчета="Текущий счет" НомерСчета="1AAA457765" Остаток="150.00" />
    </Счета>
  </Человек>
</Root>


Я попробовал сделать это при помощи конструкции FOR XML PATH:

SELECT Person.ID AS 'Человек/@Номер',
       Person.F AS 'Человек/ПерсИнфо/ФИО/@Фамилия',
       Person.I AS 'Человек/ПерсИнфо/ФИО/@Имя',
       Person.O AS 'Человек/ПерсИнфо/ФИО/@Отчество',
       Person.Seria AS 'Человек/ПерсИнфо/Паспорт/@Серия',
       Person.Nomer AS 'Человек/ПерсИнфо/Паспорт/@Номер',
       Person.Kod_sub AS 'Человек/ПерсИнфо/Адрес/@КодСубъекта',
       Person.Address AS 'Человек/ПерсИнфо/Адрес/@Адрес',
       Accounts.Vid_acc AS 'Человек/Счета/Счет/@ВидСчета',
       Accounts.Account AS 'Человек/Счета/Счет/@НомерСчета',
       Accounts.Rest AS 'Человек/Счета/Счет/@Остаток'
FROM Person
INNER JOIN Accounts ON (Person.ID = Accounts.ID)
FOR XML PATH(''), ROOT('Root')
;


Но у меня не получается сгруппировать все счета одного человека в один блок "Человек". То есть, сколько счетов у одного человека, столько раз блок с этим (одним и тем же) человеком встречается в итоговом XML-документе. Нужно же, чтобы каждый человек присутствовал в итоговом XML-документе только один раз, и у него были перечислены все его счета.
Подскажите, пожалуйста, каким образом можно решить данную проблему.

Я использую MS SQL Server 2005.
1 авг 16, 17:01    [19483165]     Ответить | Цитировать Сообщить модератору
 Re: Создать XML-структуру из 2-х таблиц  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
SELECT p.id AS [@Номер]
     , p.F AS [ПерсИнфо/ФИО/@Фамилия]
     , p.I AS [ПерсИнфо/ФИО/@Имя]
     , p.O AS [ПерсИнфо/ФИО/@Отчество]
     , p.Seria AS [ПерсИнфо/Паспорт/@Серия]
     , p.Nomer AS [ПерсИнфо/Паспорт/@Номер]
     , p.Kod_sub AS [ПерсИнфо/Адрес/@КодСубъекта]
     , p.[Address] AS [ПерсИнфо/Адрес/@Адрес]
     , (
            SELECT
                a.Vid_acc AS [@ВидСчета],
                a.Account AS [@НомерСчета],
                a.Rest AS [@Остаток]
            FROM dbo.Accounts a
            WHERE a.ID = p.ID
            FOR XML PATH('Счет'), ROOT('Счета'), TYPE
     )
FROM dbo.Person p
FOR XML PATH('Человек'), ROOT('Root')
1 авг 16, 17:11    [19483231]     Ответить | Цитировать Сообщить модератору
 Re: Создать XML-структуру из 2-х таблиц  [new]
uncertain
Member

Откуда:
Сообщений: 2
AlanDenton, огромное спасибо!
То, что нужно!!!
1 авг 16, 22:23    [19484207]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить