Создание XML из объединения нескольких таблиц в SQL Server - PullRequest
3 голосов
/ 31 июля 2009

Имеется схема базы данных с родительской таблицей и двумя или более дочерними таблицами. Например:

Database Diagram

Можно ли создать запрос, используя оператор for xml, который выводит следующий XML:

<?xml version="1.0"?>
<person>
    <name>Joe Bloggs</name>
    <age>25</age>
    <address>
        <streetAddress>123 Test Street</streetAddress>
        <town>Example Town</town>
        <postcode>A12 3BC</postcode>
    </address>
    <address>
        <streetAddress>124 Test Street</streetAddress>
        <town>Example Town</town>
        <postcode>A12 3BC</postcode>
    </address>
    <contact>
        <type>Home Phone</type>
        <value>01234 567890</value>
    </contact>
    <contact>
        <type>Work Phone</type>
        <value>01987 654321</value>
    </contact>
    <contact>
        <type>Email Address</type>
        <value>joe@example.com</value>
    </contact>
</person>

Моя первоначальная попытка:

select person.name, person.age,
        address.streetAddress, address.town, address.postcode,
        contact.type, contact.value
    from Person as person
        left join Address as address on person.PersonID = address.PersonID
        left join Contact as contact on person.PersonID = contact.PersonID
    where person.PersonID = 1
    for xml auto, elements

Получил этот результат, в котором выводятся все комбинации контакта и адреса:

<?xml version="1.0" encoding="utf-8"?>
<person>
    <name>Joe Bloggs</name>
    <age>25</age>
    <address>
        <streetAddress>123 Test Street</streetAddress>
        <town>Example Town</town>
        <postcode>A12 3BC</postcode>
        <contact>
            <type>Home Phone</type>
            <value>01234 567890</value>
        </contact>
        <contact>
            <type>Work Phone</type>
            <value>01987 654321</value>
        </contact>
        <contact>
            <type>Email Address</type>
            <value>joe@example.com</value>
        </contact>
    </address>
    <address>
        <streetAddress>124 Test Street</streetAddress>
        <town>Example Town</town>
        <postcode>A32 1BC</postcode>
        <contact>
            <type>Home Phone</type>
            <value>01234 567890</value>
        </contact>
        <contact>
            <type>Work Phone</type>
            <value>01987 654321</value>
        </contact>
        <contact>
            <type>Email Address</type>
            <value>joe@example.com</value>
        </contact>
    </address>
</person>

Использование одного левого соединения с таблицей контактов или адресов дает часть того, что мне нужно, но после добавления второго соединения оно начинает работать неправильно. Есть ли другой метод, который можно использовать для достижения результата, который я ищу?

1 Ответ

13 голосов
/ 31 июля 2009
SELECT  person.name, person.age,
        (
        SELECT  address.streetAddress, address.town, address.postcode
        FROM    Address as address
        WHERE   person.PersonID = address.PersonID
        FOR XML PATH('ADDRESS'), TYPE
        ),
        (
        SELECT  contact.type, contact.value
        FROM    Contact as contact
        WHERE   person.PersonID = contact.PersonID
        FOR XML PATH('CONTACT'), TYPE
        ),
FROM    Person as person
WHERE   person.PersonID = 1
FOR XML AUTO, ELEMENTS
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...